2012-01-26 102 views
26

目前,我正在C++ 11中使用std::thread实现一个多线程项目。我使用std::condition_variable来同步线程。具体来说,一个消费函数调用wait()成员函数std::condition_variable来等待来自全局任务队列的任务,另一个生成器函数生成任务并将其放入队列中。但我不知道std::condition_variable的成员函数notify_all()notify_one()之间的区别。我应该在生产者函数中使用哪个函数?谢谢!std :: condition_variable的notify_all()和notify_one()有什么区别?

回答

22

如果在条件变量上有十个线程被阻塞,例如,notify_one()将只解锁一个线程,而notify_all()将全部解除阻塞。在你的情况下,你会想要使用notify_one(),所以你不会唤醒没有任何工作等待的线程。

+1

谢谢,GMan。我从互联网上阅读了一些文件。就像你所说的一样。然而,通常在互斥体上使用wait()函数,例如, std :: unique_lock ul(m_mutexTask); (m_lTask​​.empty()){m_condTask.wait(ul); }。然后,即使notify_all()唤醒所有线程,只有一个线程可以锁定互斥锁,对吧? –

+6

只有一个线程会一次锁定互斥锁,但一旦它们获得互斥锁,它们将全部从“等待”中返回。 –

+13

@云:使用哪一个取决于是否有任何等待的线程可以处理被等待的东西。如果有的话(例如,队列中有多个相同的读取器),那么你使用notify_one,因为这肯定更有效。如果有一个更复杂的条件,使得只有一个等待线程实际上可以成功使用循环条件,则必须唤醒所有线程,因为无法控制哪个线程将被notify_one唤醒。 –

相关问题