std::sync::atomic::AtomicUsize
实现Sync
,这意味着在多个线程之间共享时,不可变引用没有数据争用。为什么AtomicUsize
没有实施Send
?是否存在与创建原子的线程链接的状态,或者这是与原子意图使用方式有关的语言设计决策,即通过Arc<_>
等。
答案 0 :(得分:4)
这是一招! AtomicUsize
实施Send
:
use std::sync::atomic::AtomicUsize;
fn checker<T>(_: T) where T: Send {}
fn main() {
checker(AtomicUsize::default());
}
事实上,甚至还有automated test that ensures this is the case。
These auto traits are now documented,感谢change made to rustdoc。
问题在于Send
的实施方式:
当编译器确定它是合适的时,会自动导出该特征。
这意味着Rustdoc不知道Send
是针对某个类型实现的,因为大多数类型都没有明确地实现它。
这解释了为什么AtomicPtr<T>
出现在实施者列表中:它有一个忽略T
类型的特殊实现。