2011-11-14 3 views
7

다음은 간단한 문제입니다.C++ 멀티 스레드 동기화

A -> B -> C -> A -> B -> C -> A -> B -> ....... 

난 모든 스레드가 모든 스레드 B. 도달 한 경우 모든 스레드에 의해 B의 실행은 단지 시작되어야 즉 동시에 명령 B를 실행하는 것을 원한다

는 무한 루프 (3)의 지시에 따라 실행 N 스레드있다 따라서 B -> C -> A를 실행 한 스레드가 있으면 다른 스레드도 실행할 준비가 될 때까지 기다려야합니다.

가능한 경우 작업 할 수있는 휴대용 솔루션을 알려주십시오. 두 창 모두에서 & MAC.

+0

어제 ** [Bartosz Milewski가 C++ 11 동시성 시리즈에 자신의 vidcast를 게시했습니다 : 9. 조건 변수] (http://bartoszmilewski.wordpress.com/2011/11/13/c11-concurrency-series-9 -condition-variables /) **. 나는 그것을 시리즈에서 가장 재미있어했다. (처음에는 다른 사람들을 볼 필요가 없음) – sehe

답변

4

Boost thread library, 특히 섹션 번호 condition variables을 확인해야합니다.

+7

[장벽]을 원하는 것처럼 들리 겠지만 (http://www.boost.org/doc/libs/1_47_0/) doc/html/thread/synchronization.html # thread.synchronization.barriers) –

+0

@MikeSeymour : 답변으로 추가하지 않으시겠습니까? – jgauffin

+0

감사합니다. 마이크, 그렇습니다. 장벽이 필요한 것 같습니다. 내가 세부 사항에 들어가게하고 내가 문제를 안고있는 경우를 대비하여 돌아 가자. 다시 한 번 감사드립니다! – arvin

0

N-1 세마포 및 뮤텍스의 배열은? 모든 쓰레드는 뮤텍스를 획득하고, 카운터를 포함하고, N보다 작 으면 뮤텍스를 해제하고 [카운터]에서 세마포어 어레이를 기다린다. N 번째 스레드는 카운터를 N으로 찾고, 모든 세마포어를 신호하고, 카운터를 0으로 재설정하고, 'B'를 실행하여 뮤텍스를 해제하고 종료합니다. 다른 쓰레드는 릴리즈 될 때 B도 실행하지만 N 번째 쓰레드가 'B'를 실행하고 뮤텍스를 릴리즈 할 때까지 반복 할 수 없다.

모든 멀티 태스킹 OS에는 세마포/뮤텍스가 있습니다. 가능한 경우 세마포 대신 이벤트를 사용할 수 있습니다.

+1

실제로, [n-1] 번 시그널링 된 하나의 세마포어는 괜찮을 것입니다. 이벤트와 달리 세마포어에는 배열이 필요 없습니다. –