2013-01-09 5 views
6

는 다음과 같은 상황을 생각해 보자.대기 (POSIX 스레드, C++)

bar()가 foo의 상태를 절대로 변경하지 않으므로 여러 번 병렬로 실행하는 것이 좋습니다.

외부에서 ("작업자"스레드 중 하나가 아닌 다른 스레드에서) foo의 상태를 변경해야 할 때 문제가 발생합니다. 호출 스레드가 차단 될 때까지 foo를 잠글 수있는 방법은 무엇입니까? 마지막 작업자 스레드는 bar()로 끝나고 foo를 다시 릴리스 할 때까지 모든 작업자 스레드가 bar()에서 차단됩니까?

분명히 bar() 실행 중에 잠긴 상태의 뮤텍스를 사용할 수 없습니다. 왜냐하면 거기에 동시성이 없기 때문입니다.

아이디어가 있으십니까? 아니면 이러한 유형의 문제에 대한 더 나은 디자인이 있습니까?

+3

[Readers-writer lock] (http://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock) – hmjd

+0

바 기능 호출과 관련하여 작업자 스레드에 뮤텍스를 도입하지 않는 이유는 무엇입니까? 또한 foos 상태를 변경하려는 호출 스레드에서. 호출 쓰레드는 뮤텍스를 잠그고 안전하게 foo의 상태를 변경할 수있다. – mgr

+2

'pthread_rwlock_t'는 당신에게 흥미로울 것입니다. – WhozCraig

답변

4

나는 당신이 달성하려고하는 방법을 잘 모르겠습니다, 노동자 아무도 작가를 업데이트 수 있도록 foo는 사용되지 않습니다,하지만 그것이 문제가 아닌 경우 다음 단지 read/write mutex (노동자에를 사용 기입 락을 취득하는 경우는 라이터가됩니다.

foo Copy-on-Write를 만드는 것이 좋습니다. 이렇게하면 동기화 오버 헤드가 0에 가깝게됩니다. 이를 달성하기 위해 shared_ptr atomically을 사용할 수 있습니다.

+0

pthread_rwlock_t에 대한 모든 포인터 덕분에! – Pontomedon