Skip to content

败犬日报 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.