std :: condition_variable :: notify_all()保证

Mar*_*tin 4 c++ c++11

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

R. *_*des 5

除了§1.10第2段给出的相当模糊之外,无法保证调度:

实现应确保所有未阻塞的线程最终取得进展.[ 注意:标准库函数可能会静默阻塞I/O或锁定.执行环境中的因素(包括外部强加的线程优先级)可能会阻止实现对前进进度做出某些保证.- 结束说明 ]

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

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