【问题标题】:std::condition_variable::notify_all() guaranteesstd::condition_variable::notify_all() 保证
【发布时间】:2012-12-18 20:51:37
【问题描述】:

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

【问题讨论】:

  • 等待...“在之前任何被唤醒的读者甚至开始拥有锁。”和“在所有被通知的读者都完成锁定步骤之后?”...是哪一个?之前还是之后?

标签: c++ c++11


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 2022-01-25
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 2018-06-24
    • 2023-01-04
    相关资源
    最近更新 更多