std::sync::atomic::AtomicUsize实现Sync,这意味着当多个线程之间共享时,不可变引用没有数据争用.为什么不AtomicUsize实施Send?是否存在与创建原子的线程链接的状态,或者这是与原子意图使用的方式有关的语言设计决策,即通过Arc<_>等等.
这是一个诡计!AtomicUsize 确实实施Send:
use std::sync::atomic::AtomicUsize;
fn checker<T>(_: T) where T: Send {}
fn main() {
checker(AtomicUsize::default());
}
Run Code Online (Sandbox Code Playgroud)
事实上,甚至有一个自动化测试可以确保情况确实如此。
由于对 rustdoc 所做的更改,这些自动特征现已记录在案。
问题在于如何Send实现:
当编译器确定它合适时,会自动派生此特征。
这意味着 Rustdoc 不知道它Send是为类型实现的,因为大多数类型没有显式实现它。
这解释了为什么AtomicPtr<T>出现在实现者列表中:它有一个特殊的实现,忽略T.