範例
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>:使用 OS 層級的原始元件,這類元件必須在建立該元件的 執行緒上釋放記憶體。
!Send + !Sync
以下型別不會防護執行緒安全,也無法轉移至其他執行緒:
Rc<T>:每個Rc<T>都有一個RcBox<T>參考,其中包含一個 非原子參考計數。*const T、*mut T:Rust 會假定原始指標可能有特殊的 並行考量。