rust 有没有一个平台没有原生指针大小的原子,但有其他大小的原子?

u5i3ibmn  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(81)

我正在对广泛使用的开源库进行重构,并希望使其尽可能健壮。
目前,它使用原子size_t变量,如果它是支持的,但我想知道它是否会错过一些模糊的平台,例如,32位原子,而有64位指针。

lmvvr0a8

lmvvr0a81#

我敢肯定,所有现代主流系统都有无锁的指针宽度原子,至少运行Linux等操作系统的系统是这样。
8-像AVR这样的16位平台通常只能加载/存储字节,但指针是16位或24位的,所以size_t也不会是无锁的(但AVR系统是单核的,即使是单字节,也只能通过禁用中断来获得RMW原子性)。
只有分段内存模型或其他模型的指针会比size_t宽。平面内存模型几乎是通用的,其中size_tuintptr_t与指针大小相同,宽度相同。
许多ISA对于2x指针宽度具有无锁原子RMW,但对于该宽度并不总是有效的纯加载或纯存储。(例如,没有AVX的x86-64最近记录的128位原子性保证只有lock cmpxchg16b,它可以被“滥用”用于纯加载和纯存储。但是这会弄脏该高速缓存行,这就是为什么GCC从7开始就不内联16字节的原子加载、存储或RMW,即使是-mcx16。)
Rust文档(https://doc.rust-lang.org/stable/std/sync/atomic/index.html)讨论了一些较旧的平台,如armv 5 te,显然只有原子加载/存储,而没有原子RMW,如CAS甚至交换/交换。这需要操作系统支持,可能会在单核CPU/MCU上禁用中断。类似于“thumbv 6 m”。但这对AtomicUsizeAtomicPtr来说都是一个问题。

相关问题