代码之家  ›  专栏  ›  技术社区  ›  albert

std::atomic<T>::wait-伪唤醒是否可能?

  •  3
  • albert  · 技术社区  · 8 月前

    cppreference regarding std::atomic<T>::wait :

    void wait( T old, std::memory_order order =
                         std::memory_order::seq_cst ) const noexcept;
    

    执行原子等待操作。表现得好像它重复执行以下步骤:

    • 比较此值的表示->用旧的装载(订单)。 如果它们相等,则阻塞直到*这由notify_one()或notify_all()通知, 或者线程被虚假地解锁 .
    • 否则,返回。

    这些函数保证只有在值发生变化时才会返回,即使底层实现解除了虚假阻塞 .

    我很困惑,我需要关心虚假的觉醒吗?这意味着 wait() 即使值仍然存在,也可以返回 old -还是不?

    2 回复  |  直到 8 月前
        1
  •  4
  •   wohlstad    8 月前

    你不需要关心虚假的觉醒。
    wait() 如果值仍然存在,则不会返回 old .

    这可以从以下内容中理解 documentation 你引用:

    1. 有人提到,行为应该像的步骤(包括虚假唤醒的可能性)已经完成 反复地 ,所以即使出现虚假的唤醒 wait() 将不会返回,并将继续循环比较以下结果 load() 与价值 老的 .

    2. 为了确保清楚,文档明确提到:

      这些函数保证仅在值发生变化时返回, 即使底层实现消除了虚假的障碍 .

      (重点是我的)

        2
  •  1
  •   Steve    8 月前

    它不能。如果线程被错误地唤醒,它将重新比较值,如果值不变,则再次等待。