현재 C++ 11에서 std::thread
을 사용하는 멀티 스레드 프로젝트를 구현 중입니다. 나는 std::condition_variable
을 사용하여 스레드를 동기화합니다. 상세하게는 하나의 소비자 함수가 wait()
구성원 함수 std::condition_variable
을 호출하여 전역 작업 큐에서 작업을 대기하고 다른 생산자 함수가 작업을 생성하여 큐에 넣습니다. 그러나 의 notify_all()
과 notify_one()
멤버 함수의 차이를 알지 못합니다. 생산자 함수에서 어떤 함수를 사용해야합니까? 감사!std :: condition_variable의 notify_all()과 notify_one()의 차이점은 무엇입니까?
26
A
답변
22
조건 변수에 10 개의 스레드가 차단 된 경우 (예 : notify_one()
)는 하나의 스레드 만 차단을 해제하고 notify_all()
은 모든 스레드를 차단 해제합니다. 귀하의 경우에는 notify_one()
을 사용하여 대기중인 작업이없는 스레드를 깨우지 않으려합니다.
관련 문제
- 1. std :: condition_variable과 std :: condition_variable_any의 차이점은 무엇입니까?
- 2. std :: set와 std :: vector의 차이점은 무엇입니까?
- 3. -std = C++ 11과 -std = gnu ++ 11의 차이점은 무엇입니까?
- 4. ATL CAutoPtr과 STL std :: auto_ptr의 차이점은 무엇입니까?
- 5. 타입 캐스팅과 std :: move() 사용의 차이점은 무엇입니까?
- 6. std :: mem_fun 대 std :: mem_fn
- 7. std :: function <>과 표준 함수 포인터의 차이점은 무엇입니까?
- 8. std :: hash_set 대 std :: unordered_set, 그들은 똑같은가요?
- 9. input_iterator_tag와 forward_iterator_tag의 차이점은 무엇입니까?
- 10. boost :: bind with maps, 바인딩 std :: pair와 std :: map :: value_type의 차이점은 무엇입니까?
- 11. std :: setter에 대해 .begin()과 .end()를 std :: set에 사용하는 것의 차이점은 무엇입니까?
- 12. 이들의 차이점은 무엇입니까?
- 13. sizeof와 alignof의 차이점은 무엇입니까?
- 14. C++ 11 : std :: condition_variable이 std :: unique_lock을 사용하는 이유는 무엇입니까?
- 15. 'a'와 'a'의 차이점은 무엇입니까?
- 16. float2와 cuComplex의 차이점은 무엇입니까?
- 17. std :: tm 또는 std :: gmtime의 한계는 무엇입니까?
- 18. std :: reverse_iterator의 단점은 무엇입니까?
- 19. std :: safe_string이란 무엇입니까?
- 20. 이 두 지역 변수의 차이점은 무엇입니까?
- 21. "cell.text"와 "cell.textlabel.text"의 차이점은 무엇입니까?
- 22. std :: remove가 std :: vector에서 제거되지 않습니다.
- 23. std :: std :: string과 std :: vector 사이의 이동
- 24. std :: ifstream 생성자가 std :: string을 사용하지 않는 이유는 무엇입니까?
- 25. MultiByteToWideCharArray를 사용하여 std :: string을 std :: wstring으로 변환하는 이유는 무엇입니까?
- 26. std :: vector와 std :: array의 C++ initializer_list 동작이 다른 이유는 무엇입니까?
- 27. std :: bind와 std :: thread는 인수를 항상 복사하는 이유는 무엇입니까?
- 28. `std :: set`의 문제점은 무엇입니까?
- 29. 올바른 std :: set_union 코드는 무엇입니까?
- 30. SGI slist와 C++ 11 forward_list의 차이점은 무엇입니까?
고마워, GMan. 인터넷에서 일부 문서를 읽었습니다. 네가 한 말처럼. 그러나 일반적으로 wait() 함수는 뮤텍스에서 사용됩니다. std :: unique_lock ul (m_mutexTask); while (m_lTask.empty()) {m_condTask.wait (ul); }. 그런 다음 notify_all()도 모든 스레드를 깨우므로 하나의 스레드 만 뮤텍스를 잠글 수 있습니다. –
한 스레드 만 뮤텍스를 잠글 수 있지만 뮤텍스를 얻 자마자 '대기'에서 모두 돌아옵니다. –
@ 윤 : 사용할 대기 스레드는 대기중인 스레드가 대기중인 스레드를 처리 할 수 있는지 여부에 달려 있습니다. 어떤 것이 든 (예 : 대기열에있는 동일한 독자가 여러 개인 경우) notify_one을 사용하면 훨씬 효율적입니다. 기다리는 스레드가 루프 상태에서 실제로 성공할 수있는보다 복잡한 조건이있는 경우 notify_one을 통해 깨우는 스레드를 제어 할 수 없으므로 모두 깨워 야합니다. –