在此示例中将唤醒多少个等待线程:
第一个帖子:
void wakeUp2Threads()
{
std::unique_lock<std::mutex> lock(condvar_mutex);
condvar.notify_one();
condvar.notify_one();
}
第二个帖子:
{
std::unique_lock<std::mutex> lock(condvar_mutex);
condvar.wait(lock); <- 2nd thread has entered here before 1st thread entered wakeUp2Threads.
}
第三个帖子(与第二个相同):
{
std::unique_lock<std::mutex> lock(condvar_mutex);
condvar.wait(lock); <- 3rd thread has entered here before 1st thread entered wakeUp2Threads.
}
有没有保证在这个例子中两个通知都会被传递到不同的线程,而不是多次传递给同一个线程?
即notify_one()的含义是什么:
1) notify one thread, no matter has it been already notified (but has not been woken up yet), or not. (* see note)
or
2) notify one thread, but only this one, which has not been notified yet.
(*)注意!我不是在这里谈论场景“过去某处已经通知等待线程,醒来,做了一些事情并再次输入condvar.wait() “ - 当然,在这种情况下,几个notify_one()例程可以一遍又一遍地唤醒同一个线程。
我在谈论另一个案例:
notify_one()已通知等待线程有关唤醒,但是在此等待线程从内核调度程序接收到时隙并继续执行之前 - 另一个notify_one()已再次被调用。 第二次通知是否有可能再次发送到同一个帖子,而它尚未从第一次通知中唤醒?
答案 0 :(得分:5)
notify_one
调用原子地解锁一个线程。这意味着当第二次调用时,它不能解除阻塞同一个线程,因为它不再被阻塞。
这在标准第30.5 / 3和30.5.1 / 7节中有详细说明。