如何使用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(); } // 满足条件后的逻辑
关键细节说明
- 必须循环检查:和条件变量的
wait一样,atomic::wait可能发生虚假唤醒——线程被唤醒但原子变量的值并未满足预期。因此每次唤醒后必须重新加载变量值并检查条件。 - 唤醒操作:修改
num_tasks的线程需要调用notify_one()或notify_all()来触发等待线程的唤醒,就像条件变量的通知逻辑:// 修改num_tasks的线程示例 num_tasks.store(0); num_tasks.notify_all(); // 按需选择notify_one/notify_all - 内存可见性:原子操作本身保证了内存可见性,无需依赖互斥锁的内存屏障,这也是atomic wait的优势之一。
对比优势
- 无需额外维护互斥锁和条件变量,代码更简洁
- 减少了锁竞争的潜在开销
- 避免了条件变量与互斥锁绑定的使用限制
内容的提问来源于stack exchange,提问作者user13177419
相关产品推荐
相关产品推荐

