首页 >后端开发 >C++ >C/C 标准是否保证 ARM 和 x86-64 架构上任何数据类型的原子操作?

C/C 标准是否保证 ARM 和 x86-64 架构上任何数据类型的原子操作?

DDD
DDD原创
2024-12-15 14:29:31452浏览

Do C/C   Standards Guarantee Atomic Operations for Any Data Type on ARM and x86-64 Architectures?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn