GNU C 和 GNU C 中 64 位计算机上的哪些类型本质上是原子的?
与 C11 及更高版本或 C 11 及更高版本不同,它们提供使用 _Atomic 或 std::atomic 类型保证原子性,C 和 C 语言标准本身不保证原子读取和写道。相反,原子性级别取决于编译器实现和目标体系结构。
在 x86-64 处理器上运行 Linux 的 64 位计算机上,不同数据类型的自然原子性会有所不同。 GNU C 和 GNU C 编译器( gcc 和 g )为特定类型提供一定级别的原子性。
原子类型:
-
int:头文件中的typedef _Atomic_word;
-
__sig_atomic_t:头文件中的typedef;表示int是原子的。定义原子整数类型,确保在存在异步中断的情况下进行原子读写。
非原子类型:
- int64_t(长long)
- uint64_t(无符号 long long)
- 双精度(64 位)
- 长双(也64 位)
附加说明:
- 原子性是指原子读写,而不是原子递增、递减或复合赋值。
- 需要注意的是,虽然某些类型在某些情况下保证是原子的上下文(例如, volatile sig_atomic_t 对于信号来说是原子的),对于线程来说它们不一定是原子的。
- 编译器可能会以打破原子性假设的方式优化代码,特别是如果这些假设没有明确语言标准中规定。
- 为了确保线程安全的并发访问,显式使用 _Atomic 或 std::atomic 类型是推荐。
以上是哪些数据类型在 64 位 GNU C/C 系统上本质上是原子的?的详细内容。更多信息请关注PHP中文网其他相关文章!