败犬日报 2025-02-15
1. 内存序先写后读的问题
cpp
atomic<int> done;
atomic<int> waiting;
void notify() {
done = 1;
if (!waiting)
return;
// ... wake up waiter...
}
void wait() {
waiting = 1;
if (done)
return;
// ... sleep...
}
done, waiting 读的内存序是 acquire,写是 release。并发调用 notify 和 wait,为什么有可能出现 notify 立刻返回且 wait 陷入 sleep?
因为内存序的定义是这样的。acquire 阻止之后的指令不能排到前面,release 阻止之前的指令不能排到后面。但是先写后读不同的变量(同一变量有保障),不能阻止它们的乱序成先读后写。
所以这里需要 seqcst 内存序。
也可以用 std::atomic_thread_fence。
2. 内存序程序出了 bug,定位起来可太难了
一般不要碰。
3. 不同架构上的内存序
https://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html
4. 内存序如果是运行时的值
一般会按照 seqcst 处理。
https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html 有记载:
These built-in functions map any run-time value to
__ATOMIC_SEQ_CST
rather than invoke a runtime library call or inline a switch statement.