2012-01-26 2 views
26

현재 C++ 11에서 std::thread을 사용하는 멀티 스레드 프로젝트를 구현 중입니다. 나는 std::condition_variable을 사용하여 스레드를 동기화합니다. 상세하게는 하나의 소비자 함수가 wait() 구성원 함수 std::condition_variable을 호출하여 전역 작업 큐에서 작업을 대기하고 다른 생산자 함수가 작업을 생성하여 큐에 넣습니다. 그러나 의 notify_all()notify_one() 멤버 함수의 차이를 알지 못합니다. 생산자 함수에서 어떤 함수를 사용해야합니까? 감사!std :: condition_variable의 notify_all()과 notify_one()의 차이점은 무엇입니까?

답변

22

조건 변수에 10 개의 스레드가 차단 된 경우 (예 : notify_one())는 하나의 스레드 만 차단을 해제하고 notify_all()은 모든 스레드를 차단 해제합니다. 귀하의 경우에는 notify_one()을 사용하여 대기중인 작업이없는 스레드를 깨우지 않으려합니다.

+1

고마워, GMan. 인터넷에서 일부 문서를 읽었습니다. 네가 한 말처럼. 그러나 일반적으로 wait() 함수는 뮤텍스에서 사용됩니다. std :: unique_lock ul (m_mutexTask); while (m_lTask.empty()) {m_condTask.wait (ul); }. 그런 다음 notify_all()도 모든 스레드를 깨우므로 하나의 스레드 만 뮤텍스를 잠글 수 있습니다. –

+6

한 스레드 만 뮤텍스를 잠글 수 있지만 뮤텍스를 얻 자마자 '대기'에서 모두 돌아옵니다. –

+13

@ 윤 : 사용할 대기 스레드는 대기중인 스레드가 대기중인 스레드를 처리 할 수 ​​있는지 여부에 달려 있습니다. 어떤 것이 든 (예 : 대기열에있는 동일한 독자가 여러 개인 경우) notify_one을 사용하면 훨씬 효율적입니다. 기다리는 스레드가 루프 상태에서 실제로 성공할 수있는보다 복잡한 조건이있는 경우 notify_one을 통해 깨우는 스레드를 제어 할 수 없으므로 모두 깨워 야합니다. –

관련 문제