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.