5

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

4

1 回答 1

6

除了第 1.10 节第 2 段中给出的相当模糊的安排之外,没有任何关于调度的保证:

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

如果你想确保没有读者在生产者之前获得锁,你可以简单地在通知之前获得锁。

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

于 2012-12-18T12:03:14.633 回答