综观该std::sync::atomic
模块,可以看到很多不同的Atomic*
类型,如AtomicU32
,AtomicI16
和更多。这是为什么?
锈病泛型和-在我看来-这将是可能增加一个通用的Atomic
,其中T
由模块中定义的一些特质界(在Java中上下的命名:Atomicable
)。该特征将通过可以以原子方式处理的类型来实现,并且用户可以使用Atomic
而不是AtomicU32
。
为什么没有通用名称Atomic
?为什么会有许多不同的类型呢?
拥有AtomicU8
(例如)目的是使用底层硬件来执行原子指令,例如在x86上执行CMPXCHG
指令。
原始RFC#1505建议使用一种Atomic
类型。一个主要的关注点是,人们会T
以一种意想不到的方式使用,例如Atomic<[u8; 32]>
,由于缺乏支持这些功能的硬件,因此无法使用。提出
了使用a的后备/解决方法Mutex
,但感觉就像作弊一样,因为编译器对于不同的T
s 会有不同的表现。
最终以RFC#1543结束,该协议引入了我们今天所知道的Atomic {I,U} {8,16,32,64}类型。
然后在PR#33048中实现,并在PR#56753(Rust 1.34.0)中得到稳定。
为了确保底层硬件确实支持原子操作,这些类型具有cfg属性,例如,AtomicI8
为#[cfg(target_has_atomic = "8")]
,因为AtomicI16
为#[cfg(target_has_atomic = "16")]
etcetera。