std :: condition_variable :: notify_all()保证

时间:2012-12-18 12:00:46

标签: c++ c++11

假设条件变量上有N个等待线程(读取器),这些线程由另一个线程(生产者)通知。现在所有的N个读者都会尝试拥有他们所引用的unique_lock,一次一个。现在假设生产者想要再次锁定相同的unique_lock,出于某些原因,在任何那些醒来的读者甚至开始拥有锁之前。按照标准,是否有保证生产者只有在所有通知读者开始锁定步骤后才能成功(尝试)进入其关键部分?

1 个答案:

答案 0 :(得分:5)

除了§1.10第2段给出的相当模糊之外,无法保证日程安排:

  

实现应该最终确保所有未阻塞的线程   取得进展。 [注意:标准库函数可能会静默阻塞   在I / O或锁上。执行环境中的因素,包括   外部强加的线程优先级,可能会阻止实现   从确保前进的某些方面来看。 - 结束记录]

如果你想确保没有读者在制作人之前获得锁定,你可以在通知之前获取锁定。

如果你想确保生产者只能在所有读者完成后获得锁定,你需要一些更复杂的同步,可能涉及某种计数器。