std::condition_variable::notify_all() guarantees

std::condition_variable::notify_all() guarantees

本文关键字:guarantees all variable condition std notify      更新时间:2023-10-16

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

除了

§1.10第2段中给出的相当模糊的时间表外,没有关于调度的保证:

实现应确保所有未阻塞的线程最终 捗。[ 注意:标准库函数可能会静默阻止 在 I/O 或锁上。执行环境中的因素,包括 外部强加的线程优先级,可能会阻止实现 从对前进的进展做出某些保证。—尾注 ]

如果要确保没有读取器在生产者之前获取锁,则只需在通知之前获取锁即可。

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