【发布时间】:2016-01-26 11:30:34
【问题描述】:
如果std::condition_variable 可以由于虚假唤醒而发出信号(并且我们不能确定我们需要的条件是否真的得到满足),为什么 C++ 标准库在没有谓词的情况下提供 wait() 方法的重载?可以使用这种行为的场景有哪些?
【问题讨论】:
-
我只能猜测,因为传统上 posix 和 windows API 提供的条件变量没有谓词,所以委员会希望保留它们的原始用途/API,但具有标准的、可移植的形式。除此之外,我认为没有理由使用没有谓词的 cv
-
从历史上看,系统调用是被接受的,例如。那些用于线程间通信的,每次调用时都能正常工作。
-
@MartinJames 实现无法防止虚假唤醒。这不是系统调用是否正常工作的问题,而是决定是否阻塞的线程和未阻塞但尚未运行的线程之间的固有竞争。 (例如,两个消息进入队列。我们唤醒两个线程。如果第一个线程处理这两个消息,第二个线程将看到虚假唤醒。)
标签: c++ multithreading c++11 condition-variable spurious-wakeup