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()有什么区别?
谢谢,GMan。我从互联网上阅读了一些文件。就像你所说的一样。然而,通常在互斥体上使用wait()函数,例如, std :: unique_lock ul(m_mutexTask); (m_lTask.empty()){m_condTask.wait(ul); }。然后,即使notify_all()唤醒所有线程,只有一个线程可以锁定互斥锁,对吧? –
只有一个线程会一次锁定互斥锁,但一旦它们获得互斥锁,它们将全部从“等待”中返回。 –
@云:使用哪一个取决于是否有任何等待的线程可以处理被等待的东西。如果有的话(例如,队列中有多个相同的读取器),那么你使用notify_one,因为这肯定更有效。如果有一个更复杂的条件,使得只有一个等待线程实际上可以成功使用循环条件,则必须唤醒所有线程,因为无法控制哪个线程将被notify_one唤醒。 –