为什么对于许多基本类型都只有一种“原子*”类型,而不是通用的“原子<T>”类型?

时间:2019-07-17 12:11:45

标签: rust atomic

看看the std::sync::atomic module,您会看到一堆不同的Atomic*类型,例如AtomicU32AtomicI16等。为什么会这样?

Rust具有泛型,并且-如我所见-可以添加泛型Atomic<T>,其中T受模块中定义的某些特征限制(在Java式命名中:{{ 1}})。可以通过原子方式处理的类型来实现该特征,并且用户可以只使用Atomicable而不是Atomic<u32>

为什么没有通用的AtomicU32?为什么要用一堆不同的类型呢?

1 个答案:

答案 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")]等。