【发布时间】:2021-05-05 08:11:33
【问题描述】:
对于在原子数据类型的对象上执行的存储(例如,std::atomic<uint8_t>),GCC 生成:
-
MOV指令在 release-store (std::memory_order_release) 的情况下, -
在 sequential-consistent-store (
std::memory_order_seq_cst) 的情况下使用XCHG指令。
当目标架构是 x86_64 时。但是,当是ARM64(AArch64)时,在这两种情况下,GCC都会生成相同的指令,即STLRB。没有生成其他指令(例如内存屏障),Clang 也会发生同样的情况。这是否意味着这条被描述为具有 store-relase 语义的指令实际上也提供了顺序一致性?
例如,如果两个内核上运行的两个线程将使用STLRB 存储到不同的内存位置,那么这两个存储的顺序是否唯一?这样所有其他线程都保证遵守相同的顺序?
我在问,因为根据this answer,使用 acquire-loads,不同的线程可能会观察到 release-stores 的不同顺序。为了观察相同的顺序,需要顺序一致性。
【问题讨论】:
标签: c++ x86-64 atomic arm64 memory-model