ARM 和 x86-64:无保证的原子类型
与最初的假设相反,C/C 语言标准不提供任何保证适用于任何特定数据类型的原子操作,即使是 64 位
通过信号与线程进行原子访问
区分原子性的两个概念至关重要:
GCC在 ARM 和 x86-64 上的实现
而现代 CPU(如 ARMv8)而x86-64可能会保证某些操作的原子访问,这些保证并没有体现在语言层面。 GCC 和其他编译器可以以违反这些硬件级原子性的方式优化代码,如以下示例所示:
volatile uint32_t x; uint32_t foo(void) { return (x >> 8) & 0xffff; }
即使 x 是 32 位变量,GCC 也会将 foo 编译为两个单独的 16 位变量-bit 加载,如果同时修改 x,可能会导致非原子读取。
依赖std::atomic 或 _Atomic
确保 C 和 C 中原子操作的唯一方法是显式使用 std::atomic (C ) 或 _Atomic (C) 类型,它们提供必要的同步保证线程安全访问的机制。
以上是C/C 标准是否保证 ARM 和 x86-64 架构上任何数据类型的原子操作?的详细内容。更多信息请关注PHP中文网其他相关文章!