範例
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 會假定原始指標可能有特殊的 並行考量。