std::atomic<T>::wait是否会出现虚假唤醒?是否需要关注?
std::atomic::wait 虚假唤醒疑问解析
首先看std::atomic<T>::wait的函数签名:
void wait( T old, std::memory_order order = std::memory_order::seq_cst ) const noexcept;
cppreference对该函数的行为定义等价于重复执行以下步骤:
- 调用
this->load(order)获取当前值,与old的值表示比较:- 若相等,则阻塞,直到被
notify_one()/notify_all()通知,或出现底层虚假唤醒 - 若不等,则直接返回
- 若相等,则阻塞,直到被
文档中明确强调:即使底层实现发生虚假唤醒,这些函数也保证仅在值改变时才返回。
针对你的疑问:wait()不可能在值仍为old时返回,你完全不需要额外关注底层的虚假唤醒问题。
原因很简单:函数内部已经帮你做了循环检查逻辑——哪怕底层出现虚假唤醒(也就是操作系统/硬件层面没收到通知就唤醒了等待线程),函数会立刻再次加载当前原子值并和old对比,如果值没变化,就会重新进入阻塞状态。只有当原子值确实不等于old的时候,函数才会最终返回。
也就是说,底层的虚假唤醒已经被封装在函数内部的循环里处理掉了,上层调用者不需要自己写额外的循环来处理这种情况。
内容的提问来源于stack exchange,提问作者albert
相关产品推荐
相关产品推荐

