2014-07-16 6 views
0
이이 요청 된 경우, 내가 실시간으로 실행하도록되어 영상 처리 응용 프로그램을 구현하고

C++ 동기화 단계 멀티 스레드 파이프 라인

... 요청하기 전에 DUP를 검색하기 위해 최선을 다했다

죄송합니다. 처리는 4 단계로 쉽게 나눌 수 있으며 각 단계는 이전 단계에서 생성 된 중간 값에서 작동합니다. 프로세싱은 1/30th에서 처리 할 수있는 것보다 무거워졌지만,이 애플리케이션을 4 개의 스레드로 분할하여 파이프 라인으로 전환 할 수 있다면 각 단계가 그보다 작고 모든 것이 실시간으로 실행됩니다. 완전히 받아 들일 수있는 4 프레임 래그).

저는 멀티 스레딩 프로그래밍에 상당히 익숙하며, 각 프레임의 시작 부분에서 각 스레드를 시작/중지하는 메커니즘을 찾을 수 없으므로 모든 스레드가 함께 진행됩니다 끝날 때마다 "주기"마다 완성 된 프레임. 내가 찾은 모든 프레임 워크/라이브러리는 대기열 및 작업자 스레드를 사용하여로드 균형 조정에 대해 걱정하는 것 같지만 여기에 필요한 것은 아닙니다. 내가 동기화 할 수 있다고 가정 할 때 4 개의 스레드가 수행합니다.

아무도 C++을 사용하여 시작점을 가리킬 수 있습니까?

감사합니다.

+0

스레딩 라이브러리 (예 : 부스트)를 사용하고 있습니까? 아니면 바닐라 POSIX? – wbennett

+0

['std :: condition_variable'] (http://en.cppreference.com/w/cpp/thread/condition_variable)이 귀하의 사례에 도움이 될 수 있습니다. 동기화 메커니즘과 같은 세마포어를 만들 수도 있습니다 ([이 질문 (http://stackoverflow.com/questions/3513045/conditional-variable-vs-semaphore)도 참조하십시오). –

+0

@wbennett, 나는 아직 아무것도 사용하지 않고있다. 응용 프로그램은 모두 현재 단일 스레드에서 실행됩니다 (GUI 제외). – user3846684

답변

0

4 프레임 지연을 허용한다고 가정하면 목록 노드 풀을 사용할 수 있습니다. 각 노드는 프레임 버퍼에 대한 포인터와 중간 값에 대한 포인터를 가지고 있습니다 (NULL 포인터는 스트림의 끝을 나타내는 데 사용될 수 있습니다) . 각 스레드는 멀티 스레드 메시징 시스템의 일부로 자신의 목록을 갖게됩니다. 첫 번째 스레드는 사용 가능한 풀에서 프레임 노드를 가져 와서 처리하고 노드를 다음 스레드 목록으로 보내고, 마지막 스레드는 노드를 다시 사용 가능한 풀로 반환합니다.

다음은 쓰기를 수행 할 스레드를 생성하는 예제 파일 복사 프로그램에 대한 링크입니다. 메시징 기능에서 Windows 스레딩, 뮤텍스 및 세마포를 사용하지만 메시징 기능은 간단하며 인터페이스를 변경하지 않고도 일반 기능을 사용할 수 있도록 내부적으로 변경할 수 있습니다. main() 함수는 일반적인 스레딩과 뮤텍스 및 세마포어 또는 이와 동등한 것을 사용하도록 변경할 수 있습니다.

mtcopy.zip

+0

제안과 소스 코드를 제공해 주셔서 감사합니다. 매우 유용합니다. 그러나 스레드 간의 전체 풀/대기열 메시징을 피하려고했습니다. 알고리즘의 특성에 맞지 않는다고 생각하기 때문입니다. 스레드는 결코 서로 "뒤돌아 치지"않을 것이고, 그들은 모두 비디오 소스에서 들어오는 프레임 사이의 간격으로 작업을 수행합니다. 새로운 프레임에서 작업을 시작할 때 동시에 모든 스레드에 알리는 메커니즘이 필요합니다. 각 스레드는 처리 파이프 라인의 일부입니다. 그것이 의미가있는 경우 ... – user3846684

+0

트레이드 오프는 각 스레드가 다른 스레드에서 생성 된 중간 값을 사용하는 게시물을 기반으로 한 단계별 프로세스이기 때문에 다소 어색한 시작 시퀀스입니다. 두 번째 스레드는 첫 번째 스레드가 첫 번째 프레임을 완료 할 때까지 아무 것도 할 필요가 없습니다. 네 번째 스레드는 세 번째 스레드가 첫 번째 프레임을 완료 할 때까지 아무 것도 할 수 없습니다. 메시징 시스템을 사용하면 시작이 간단 해지고 예제 코드를 보면 실제 메시징 기능은 작습니다. – rcgldr

+0

메시징 대신 이벤트 또는 조건 변수를 사용하여 각 스레드를 트리거 할 수 있습니다. – rcgldr