Exemplos

Send + Sync

A maioria dos tipos que você encontra são Send + Sync:

  • i8, f32, bool, char, &str, …
  • (T1, T2), [T; N], &[T], struct { x: T }, …
  • String, Option<T>, Vec<T>, Box<T>, …
  • Arc<T>: Explicitamente thread-safe via contagem de referência atômica.
  • Mutex<T>: Explicitamente thread-safe via bloqueio interno.
  • mpsc::Sender<T>: As of 1.72.0.
  • AtomicBool, AtomicU8, …: Usa instruções atômicas especiais.

Os tipos genéricos são tipicamente Send + Sync quando os parâmetros de tipo são Send + Sync.

Send + !Sync

Esses tipos podem ser movidos para outras threads, mas não são seguros para threads. Normalmente por causa da mutabilidade interior:

  • mpsc::Receiver<T>
  • Cell<T>
  • RefCell<T>

!Send + Sync

Esses tipos são thread-safe, mas não podem ser movidos para outro thread:

  • MutexGuard<T>: Usa primitivas a nível de sistema operacional que devem ser desalocadas no thread que as criou.

!Send + !Sync

Esses tipos não são thread-safe e não podem ser movidos para outros threads:

  • Rc<T>: cada Rc<T> tem uma referência a um RcBox<T>, que contém uma contagem de referência não atômica.
  • *const T, *mut T: Rust assume que ponteiros brutos podem ter considerações de especiais de concorrência.