2013-10-17 3 views
0

저는 OpenCV로 작성된 객체 추적기를 병렬 처리하여 여러 객체를 추적하는 프로젝트에 참여하고 있습니다. 휴대용 멀티 스레딩을위한 매우 깨끗한 인터페이스를 가진 BOOST 라이브러리를 사용하여 멀티 스레딩 부분을 수행하고 있습니다.BOOST :: thread worker syncronization, C++ & OpenCV

추적 기능이 여러 스레드에서 실행되며 초기 장면에서 감지 된 개체의 수에 따라 생성됩니다. 모든 스레드는 자신의 작업 루프를 가지고 있습니다. 프레임마다 프레임을 추적하여 개체를 추적합니다. 내 질문은 : 어떻게 내가 그들을 저장할 수 있도록 각 루프 반복에서 결과를 수집합니까? 스레드 간에는 통신이 없지만 각 루프가 끝날 때 프레임 처리가 완료되면 각 스레드의 출력을 합산하여 모든 객체에 대한 결과와 함께 전체 장면을 볼 수 있습니다. 추적.

나는 좋은 시작이다. 그러나 루프의 끝에서 모든 쓰레드를 멈추게되면 어떻게하면 결과를 얻을 수 있을지 전혀 모른다. 추가 "수집가"스레드가 필요합니까? 나는 몇 년 전만해도 병렬 컴퓨팅에 대한 나의 유일한 길을 마쳤으므로 병렬 작업에서 약간 녹슬 었습니다. 어떤 도움을 주셔서 감사합니다!

답변

1

스레드를 중지 할 필요가 없습니다. mutex (std::mutex 또는 boost::mutex)와 같은 일반적인 멀티 스레딩 기술을 사용하면 해당 정보를 얻을 수 있습니다.

실행중인 각 스레드에 대한 일부 스레드 정보를 유지할 수 있습니다. 일부는 struct ThreadInfo이고 일부는 std::list<ThreadInfo> threads 정도이므로 실행중인 모든 스레드를 추적 할 수 있습니다.

모든 ThreadInfo에는 자체 뮤텍스가 있습니다. 그리고 그 장면에 대한 일반적인 견해의 일부로 가지고 싶은 정보를 넣으십시오. 구조체에 데이터를 쓰는 동안 물론 뮤텍스를 잠 그거나 잠금 해제 할 수 있습니다. 뮤텍스를 잠그는 것은 다른 스레드가 획득하지 못하면 매우 빠릅니다 (거의 무료입니다). 그래서 대부분의 시간을 풀어 내지 마십시오.

그런 다음 메인 스레드에서 대기 상태이거나 일반보기, 매 초당 정보를 표시하려는 위치에서 threads을 모두 읽은 다음 해당 정보를 읽습니다. mutex를 잠 그거나 잠금 해제해야 함).

+0

고마워, 그게 내가 찾고 있었던 것이다. 일반 뷰를 작성하는 방법을 알아 내는데 어려움을 겪고 있기 때문에 구현하는 데 다소 시간이 걸릴 것입니다. 그러나 뮤텍스는이를 수행하는 방법입니다! – powder