c++ - 为什么boost::condition_variable可以使用pthread_cond_signal来仅唤醒一个线程

标签 c++ unix boost pthreads

在boost::condition_variable的源代码中,方法condition_variable::notify_one()尝试使用pthread_cond_signal()来仅唤醒一个线程。
https://code.woboq.org/appleseed/include/boost/thread/pthread/condition_variable.hpp.html

inline void condition_variable::notify_one() BOOST_NOEXCEPT
    {
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
        boost::pthread::pthread_mutex_scoped_lock internal_lock(&internal_mutex);
#endif
        BOOST_VERIFY(!pthread_cond_signal(&cond));
    }
但是,POSIX说:

The pthread_cond_signal() function shall unblock at least one of the threads that are blocked on the specified condition variable cond (if any threads are blocked on cond).


那么为什么boost::condition_variable确保pthread_cond_signal只是唤醒一个线程?

最佳答案

So why boost::condition_variable make sure that the pthread_cond_signal just wake up one thread???


为什么?这个问题没有意义。问题是“是否”。而且没有(如您所见)。
您可以看到它在那里使用了pthread API来解除阻止至少一个等待线程。
这只是与使用notify_allpthread_cond_broadcast相反。
这种区别是有用的,因为它可以在唤醒所有服务员很浪费的情况下提高并发操作的效率。

Related: when using condition variables, you must always take spurious wake-up into account

关于c++ - 为什么boost::condition_variable可以使用pthread_cond_signal来仅唤醒一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63030760/

相关文章:

java - 来自 JAR 的线程 "main"java.lang.NoClassDefFoundError 中出现异常

c++ - 使用 boost::asio::ip::tcp::socket::cancel() 和 socket::close()

c++ - 如何找到文本文档中最长的单词?

c++允许后台线程在退出应用程序之前完成

c++ - Boost.MultiArray 的一行初始化器

c++如何使用子类调用函数,具有父类(super class)指针

c++ - 使用 c++ STL/Boost 而不是 system() 调用重写这个简单的函数?

c++ - 字符串中值的 strchr 索引

c - 在类 UNIX 操作系统上,二进制文件的最少内存使用量是多少?

python - 在 Windows 上安装 Django