示例
Send + Sync
你遇到的类型大都属于 Send + Sync:
i8、f32、bool、char、&str…(T1, T2)、[T; N]、&[T]、struct { x: T }…String、Option<T>、Vec<T>、Box<T>…Arc<T>:明确通过原子引用计数实现线程安全。Mutex<T>:明确通过内部锁定实现线程安全。AtomicBool、AtomicU8…:使用特殊的原子指令。
当类型参数为 Send + Sync 时,泛型类型通常 为 Send + Sync。
Send + !Sync
这些类型可以移动到其他线程,但它们不是线程安全的。 这通常是由内部可变性造成的:
mpsc::Sender<T>mpsc::Receiver<T>Cell<T>RefCell<T>
!Send + Sync
这些类型是线程安全的,但它们不能移动到另一个线程:
MutexGuard<T>:使用操作系统级别的原语(必须在创建这些原语的线程上 取消分配)。
!Send + !Sync
这些类型不是线程安全的,不能移动到其他线程:
Rc<T>:每个Rc<T>都具有对RcBox<T>的引用,其中包含 非原子引用计数。*const T、*mut T:Rust 会假定原始指针可能 在并发方面有特殊的注意事项。