2012-01-26 46 views
26

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()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ì?

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ọ.

+1

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? –

+6

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. –

+13

@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. –

Các vấn đề liên quan