如果我在没有任何时间间隔的情况下两次调用std :: condition_variable :: notify_one(),将会唤醒多少等待线程,如下所示:
{
std::unique_lock<std::mutex> lock(condvar_mutex);
condvar.notify_one();
condvar.notify_one();
}
是否可以保证这些通知会多次传递到不同的线程,而不是同一个线程?
答案 0 :(得分:4)
§30.5.1.7:如果有任何线程被阻塞等待* this,则解除阻塞 那些线程。
不能保证它是不同的线程,只是它是一个线程。在两次notify_one
次调用之间的时间内,可能会重新阻止与第一个notify_one
一起醒来的同一个线程。
e.g。在下面的例子中,不保证线程3是否会被唤醒(忽略本例中的虚假唤醒)。
- thread 1:
1 condvar.notify_one();
- 3 and 4 could run here.
2 condvar.notify_one();
- thread 2:
3 condvar.wait(/*...*/);
4 condvar.wait(/*...*/);
- thread 3:
5 condvar.wait(/*...*/);
答案 1 :(得分:0)
我认为condvar_mutex
是condvar的正确互斥。
两个通知都不可能传递到同一个线程。原因是您在持有互斥锁的同时拨打notify_one
两次。因此,无论先取消哪个线程,都无法获取互斥锁,因此无法从wait
返回。如果没有首先获取互斥锁,它甚至无法从wait_for
抛出异常。
由于它无法摆脱等待,因此在调用第二个notify_one
之前,它无法返回到服务员列表。
因此,如果存在多个线程,您的代码将解除阻塞condvar上最多两个线程的阻塞。如果少,则附加通知无效。