Ang*_*ros 1 c++ multithreading atomic cpu-architecture rust
我正在对广泛使用的开源库进行重构,并希望使其尽可能强大。
目前,如果支持的话,它会使用原子size_t
变量,但我想知道它是否会错过一些不起眼的平台,例如,32 位原子同时具有 64 位指针。
我很确定所有现代主流系统都具有无锁指针宽度原子,至少是运行 Linux 等操作系统的系统。
像 AVR 这样的 8 位平台大多只能加载/存储字节,但指针是 16 或 24 位的,所以size_t
也不是无锁的。(但是 AVR 系统是单核的,即使对于单字节,您也只能通过禁用中断来获得 RMW 原子性。)
只有分段内存模型或其他模型的指针才会比size_t
. 平面内存模型几乎是通用的,其中size_t
和uintptr_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
。