範例

Send + Sync

你遇到的多數型別會是 Send + Sync

  • i8f32boolchar&str、...
  • (T1, T2)[T; N]&[T]struct { x: T }、...
  • StringOption<T>Vec<T>Box<T>、...
  • Arc<T>:透過原子參考計數明確防護執行緒安全。
  • Mutex<T>:透過內部鎖定系統明確防護執行緒安全。
  • AtomicBoolAtomicU8、...:使用特殊原子性指示。

如果型別參數是 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 會假定原始指標可能有特殊的 並行考量。