You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用C++20 atomic wait实现指定值等待?

能否用C++20的atomic wait替代等待特定值的条件变量实现?

当然可以,C++20引入的std::atomic等待/通知机制完全可以替代这类条件变量的场景,而且代码更简洁,无需额外的互斥锁依赖。

原条件变量实现回顾

你给出的等待num_tasks == 0的条件变量代码如下:

size_t num_tasks{0};
std::condition_variable cv;
std::mutex mtx;

{
  std::unique_lock lock{mtx};
  cv.wait(lock, [](){ return num_tasks == 0; });
  // 满足条件后的逻辑
}

等价的atomic wait实现

使用std::atomic的wait接口,配合循环检查目标条件即可实现完全等价的逻辑:

std::atomic<size_t> num_tasks{0};

// 等待num_tasks变为0
auto current_val = num_tasks.load();
while (current_val != 0) {
  num_tasks.wait(current_val);
  current_val = num_tasks.load();
}
// 满足条件后的逻辑

关键细节说明

  1. 必须循环检查:和条件变量的wait一样,atomic::wait可能发生虚假唤醒——线程被唤醒但原子变量的值并未满足预期。因此每次唤醒后必须重新加载变量值并检查条件。
  2. 唤醒操作:修改num_tasks的线程需要调用notify_one()或notify_all()来触发等待线程的唤醒,就像条件变量的通知逻辑:
    // 修改num_tasks的线程示例
    num_tasks.store(0);
    num_tasks.notify_all(); // 按需选择notify_one/notify_all
    
  3. 内存可见性:原子操作本身保证了内存可见性,无需依赖互斥锁的内存屏障,这也是atomic wait的优势之一。

对比优势

  • 无需额外维护互斥锁和条件变量,代码更简洁
  • 减少了锁竞争的潜在开销
  • 避免了条件变量与互斥锁绑定的使用限制

内容的提问来源于stack exchange,提问作者user13177419

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 09:38:18