如果与memory_order_acquire一起存储会发生什么

what happened if store with memory_order_acquire

本文关键字:什么 存储 acquire memory order 如果 一起      更新时间:2023-10-16

正如我们所知: 加载memory_order_acquire, 与memory_order_release一起存储 然而 我发现使用 gcc4.8.2,打开 -O2,抛出编译错误, /usr/include/c++/4.8.2/atomic:199:9:错误:"__atomic_store"的内存模型无效 但如果接近-O2,错误消失了

此外,如果使用 gcc8.3.0,即使使用 -O2 也会抛出错误

那么发生了什么?如何解释呢?

如果不进行优化,order对于内置编译器来说不可见为编译时常量,GCC 只是将运行时变量顺序视为seq_cst(而不是对值进行分支以跳过mfence(。 常量传播需要进行优化,以使非法order对检查它的编译器逻辑可见,并给出预期的错误。

std::atomic<T>::store()是一个用 C++ 编写的函数,它接受一个order参数并将该变量传递给 GNU C 内置__atomic_store

如果没有优化,就不会发生常量传播。 为什么 clang 使用 -O0 产生低效的 asm(对于这个简单的浮点和(?. 即使__attribute__((always_inline))也不会使编译器在内联时进行优化,它只是避免了实际的函数调用。 为什么这个C++包装类没有内联?

如果您查看生成的未优化的 asm,甚至还有一个非内联调用std::operator&(std::memory_order, std::__memory_order_modifier)https://godbolt.org/z/dhViAG。 但是原子存储本身是内联的。

相关文章: