我正在对广泛使用的开源库进行重构,并希望使其尽可能健壮。目前,它使用原子size_t变量,如果它是支持的,但我想知道它是否会错过一些模糊的平台,例如,32位原子,而有64位指针。
size_t
lmvvr0a81#
我敢肯定,所有现代主流系统都有无锁的指针宽度原子,至少运行Linux等操作系统的系统是这样。8-像AVR这样的16位平台通常只能加载/存储字节,但指针是16位或24位的,所以size_t也不会是无锁的(但AVR系统是单核的,即使是单字节,也只能通过禁用中断来获得RMW原子性)。只有分段内存模型或其他模型的指针会比size_t宽。平面内存模型几乎是通用的,其中size_t和uintptr_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”。但这对AtomicUsize和AtomicPtr来说都是一个问题。
uintptr_t
lock cmpxchg16b
-mcx16
AtomicUsize
AtomicPtr
1条答案
按热度按时间lmvvr0a81#
我敢肯定,所有现代主流系统都有无锁的指针宽度原子,至少运行Linux等操作系统的系统是这样。
8-像AVR这样的16位平台通常只能加载/存储字节,但指针是16位或24位的,所以
size_t
也不会是无锁的(但AVR系统是单核的,即使是单字节,也只能通过禁用中断来获得RMW原子性)。只有分段内存模型或其他模型的指针会比
size_t
宽。平面内存模型几乎是通用的,其中size_t
和uintptr_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”。但这对
AtomicUsize
和AtomicPtr
来说都是一个问题。