std :: condition_variable :: notify_one()调用两次

时间:2013-02-26 08:01:43

标签: c++ c++11 condition-variable

如果我在没有任何时间间隔的情况下两次调用std :: condition_variable :: notify_one(),将会唤醒多少等待线程,如下所示:

{
    std::unique_lock<std::mutex> lock(condvar_mutex);

    condvar.notify_one();
    condvar.notify_one();
}

是否可以保证这些通知会多次传递到不同的线程,而不是同一个线程?

2 个答案:

答案 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上最多两个线程的阻塞。如果少,则附加通知无效。