当年写并发。
你想让一个线程等另一个线程。
第一反应是条件变量。
它当然能做。
但它也让很多新手第一次见就皱眉。
锁。
谓词。
虚假唤醒。
当年:条件变量的心智负担很大
你得有一个 mutex。
还得有一个条件。
还得在 while 里等。
cv.wait(lock, [&]{ return ready; });
它正确。
也很通用。
但很多时候。
你想等的只是“某个整数变了”。
线上啪一下:你想等一个 flag,结果锁用错了
你写了个小项目。
一个线程初始化。
另一个线程等待。
你用条件变量。
但你忘了持锁。
或者你用错了同一把锁。
它就会变成偶发死等。
最烦的是。
它不一定在测试里复现。
C++20:atomic::wait / notify_one / notify_all
C++20 给 std::atomic 加了等待与通知。
它的模型更直接。
我等一个原子值。
值没变。
我就睡。
值变了。
你叫醒我。
一个最小例子
#include <atomic>
std::atomic<int> state{0};
void worker() {
state.wait(0);
// state != 0
}
void init() {
state.store(1);
state.notify_one();
}
这里 wait(0) 的意思是。
如果当前值还是 0。
就阻塞。
否则直接继续。
你刚学 C++ 会卡:这是不是自旋
不是。
它不是忙等。
它会阻塞线程。
实现上可能走 futex。
也可能走别的系统机制。
你只要记住。
它是“睡”。
不是“转”。
关键结论
如果你只是在等一个原子状态变化。
atomic wait/notify 往往比条件变量更轻。
小结
条件变量是大锤。
atomic wait/notify 是小锤。
你别为了敲一个小钉子。
搬出整套大锤。