示例
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>
:明确通过内部锁定实现线程安全。mpsc::Sender<T>
: As of 1.72.0.AtomicBool
、AtomicU8
…:使用特殊的原子指令。
当类型参数为 Send + Sync
时,泛型类型通常 为 Send + Sync
。
Send + !Sync
这些类型可以移动到其他线程,但它们不是线程安全的。 这通常是由内部可变性造成的:
mpsc::Receiver<T>
Cell<T>
RefCell<T>
!Send + Sync
这些类型是线程安全的,但它们不能移动到另一个线程:
MutexGuard<T: Sync>
: Uses OS level primitives which must be deallocated on the thread which created them.
!Send + !Sync
这些类型不是线程安全的,不能移动到其他线程:
Rc<T>
:每个Rc<T>
都具有对RcBox<T>
的引用,其中包含 非原子引用计数。*const T
、*mut T
:Rust 会假定原始指针可能 在并发方面有特殊的注意事项。