看看the std::sync::atomic
module,您会看到一堆不同的Atomic*
类型,例如AtomicU32
,AtomicI16
等。为什么会这样?
Rust具有泛型,并且-如我所见-可以添加泛型Atomic<T>
,其中T
受模块中定义的某些特征限制(在Java式命名中:{{ 1}})。可以通过原子方式处理的类型来实现该特征,并且用户可以只使用Atomicable
而不是Atomic<u32>
。
为什么没有通用的AtomicU32
?为什么要用一堆不同的类型呢?
答案 0 :(得分:11)
例如,拥有AtomicU8
的目的是使用基础硬件来执行atomic instructions,例如在x86 CMPXCHG
instruction上。
原始RFC #1505建议使用Atomic<T>
类型。 One of the main concern was,即人们会以非预期方式使用T
,例如使用Atomic<[u8; 32]>
,由于缺乏支持这些功能的硬件,因此无法提供支持。
提出了一种使用Mutex
的后备/解决方法,但它感觉像作弊,因为对于不同的T
,编译器的行为会有所不同。
It was finally closed代替了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")]
等。