Hiện tại, tôi đang triển khai dự án đa luồng sử dụng std::thread
trong C++ 11. Tôi sử dụng std::condition_variable
để đồng bộ hóa chủ đề. Cụ thể, một hàm người tiêu dùng gọi hàm wait()
thành viên của std::condition_variable
để chờ nhiệm vụ từ hàng đợi tác vụ toàn cầu, một hàm sản xuất khác tạo ra và đặt nhiệm vụ vào hàng đợi. Nhưng tôi không biết sự khác biệt giữa các hàm notify_all()
và notify_one()
thành viên của std::condition_variable
. Tôi nên sử dụng chức năng nào trong chức năng của nhà sản xuất? Cảm ơn!Sự khác nhau giữa notify_all() và notify_one() của std :: condition_variable là gì?
26
A
Trả lời
22
Nếu có mười chủ đề bị chặn trên biến điều kiện, ví dụ: notify_one()
sẽ bỏ chặn chỉ một chuỗi, trong khi notify_all()
sẽ bỏ chặn tất cả. Trong trường hợp của bạn, bạn sẽ muốn sử dụng notify_one()
để bạn không đánh thức các chủ đề không có bất kỳ công việc nào đang chờ họ.
Các vấn đề liên quan
- 1. Whats sự khác biệt giữa std :: condition_variable và std :: condition_variable_any?
- 2. Sự khác nhau giữa std :: set và std :: vector là gì?
- 3. Sự khác nhau giữa sizeof và alignof là gì?
- 4. Tôi có cần phải đồng bộ hóa std :: condition_variable/condition_variable_any :: notify_one
- 5. Sự khác nhau giữa cstdlib và stdlib.h là gì?
- 6. Sự khác nhau giữa ssize_t và ptrdiff_t là gì?
- 7. Sự khác nhau giữa fancyLocalization và preferredLanguage là gì?
- 8. Sự khác nhau giữa Danh sách và ArrayList là gì?
- 9. Sự khác nhau giữa NSLayoutAttributeBaseline và NSLayoutAttributeBottom là gì?
- 10. Sự khác nhau giữa isSaleable() và isAvailable() là gì?
- 11. Sự khác nhau giữa "bool" và "bool" là gì?
- 12. Sự khác nhau giữa cat_id và term_id là gì?
- 13. Sự khác nhau giữa SGML và XML là gì?
- 14. Sự khác nhau giữa FUTEX_WAIT và FUTEX_WAIT_PRIVATE là gì?
- 15. Sự khác nhau giữa LinkedBlockingQueue và ConcurrentLinkedQueue là gì?
- 16. Sự khác nhau giữa SyncML và CalDAV là gì?
- 17. Sự khác nhau giữa .bashrc, .bash_profile và .environment là gì?
- 18. Sự khác nhau giữa `ImmutableSortedSet` và fsharp` Set` là gì?
- 19. Sự khác nhau giữa NaN và None là gì?
- 20. Sự khác nhau chung giữa Superscalar và OoO là gì?
- 21. Sự khác nhau giữa __stdcall và _stdcal là gì?
- 22. Sự khác nhau giữa Application.Run() và Form.ShowDialog() là gì?
- 23. Sự khác nhau giữa angularjs và dust.js là gì?
- 24. Sự khác nhau giữa UPnP AV và DLNA là gì?
- 25. Sự khác nhau giữa TestTools 'UnitTesting và NUnit là gì?
- 26. Sự khác nhau giữa Server.MapPath và HostingEnvironment.MapPath là gì?
- 27. Sự khác nhau giữa AssemblyVersion, AssemblyFileVersion và AssemblyInformationalVersion là gì?
- 28. Sự khác nhau giữa HTTP_CLIENT_IP và HTTP_X_FORWARDED_FOR là gì?
- 29. Sự khác nhau giữa php.ini và .htaccess là gì?
- 30. Sự khác nhau chính giữa signcode.exe và signtool.exe là gì?
Cảm ơn, GMan. Tôi đọc một số tài liệu từ internet. Đúng như những gì bạn nói. Tuy nhiên, thường là hàm wait() được sử dụng trên một mutex, ví dụ: std :: unique_lock ul (m_mutexTask); trong khi (m_lTask.empty()) {m_condTask.wait (ul); }. Sau đó, thậm chí notify_all() thức dậy tất cả các chủ đề, chỉ có một sợi có thể khóa mutex, phải không? –
Chỉ một chuỗi sẽ khóa mutex tại một thời điểm, nhưng tất cả chúng sẽ trở về từ 'wait' ngay sau khi chúng nhận được mutex. –
@Yun: Cái nào để sử dụng phụ thuộc thực sự vào việc bất kỳ chủ đề chờ đợi nào có thể xử lý thứ đang chờ đợi. Nếu có thể thực hiện (ví dụ: nhiều trình đọc giống nhau trên hàng đợi) thì bạn sử dụng notify_one vì điều đó chắc chắn hiệu quả hơn. Nếu có một điều kiện phức tạp hơn như vậy chỉ có một luồng chờ đợi thực sự có thể thành công với điều kiện vòng lặp, bạn phải đánh thức tất cả chúng khi bạn không thể kiểm soát luồng nào sẽ được thông báo bởi notify_one. –