是否有一个平台没有本机指针大小的原子,但具有其他大小的原子?

Ang*_*ros 1 c++ multithreading atomic cpu-architecture rust

我正在对广泛使用的开源库进行重构,并希望使其尽可能强大。

目前,如果支持的话,它会使用原子size_t变量,但我想知道它是否会错过一些不起眼的平台,例如,32 位原子同时具有 64 位指针。

Pet*_*des 5

我很确定所有现代主流系统都具有无锁指针宽度原子,至少是运行 Linux 等操作系统的系统。

像 AVR 这样的 8 位平台大多只能加载/存储字节,但指针是 16 或 24 位的,所以size_t也不是无锁的。(但是 AVR 系统是单核的,即使对于单字节,您也只能通过禁用中断来获得 RMW 原子性。)

只有分段内存模型或其他模型的指针才会比size_t. 平面内存模型几乎是通用的,其中size_tuintptr_t与指针具有相同的大小和宽度。


许多 ISA 具有 2 倍指针宽度的无锁原子 RMW,但对于该宽度并不总是高效的纯加载或纯存储。(例如,没有 AVX 的 x86-64,最近记录的 128 位原子性保证只有lock cmpxchg16b,它可以被“滥用”用于纯加载和纯存储。但这会弄脏缓存行,甚至在只读时出错这就是为什么 GCC 从 7 开始就不内联 16 字节原子加载、存储或 RMW,即使是使用-mcx16。)


Rust 文档(https://doc.rust-lang.org/stable/std/sync/atomic/index.html)讨论了一些较旧的平台,例如armv5te,显然只有原子加载/存储,而不是像CAS那样的原子RMW,甚至交换/交换。这需要操作系统支持,大概是在单核 CPU/MCU 上禁用中断。对于“thumbv6m”也是如此。但这对于AtomicUsize以及 来说都是一个问题AtomicPtr

  • 对我来说,“size_t”原子的一个问题是,只要 Linux 不普遍支持“futex2”系统调用,所有非 int 大小的原子都是二等公民,因为“std::atomic:: wait()` 不会直接转换为系统调用 (2认同)