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.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::Sender<T>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>: cadaRc<T>tem uma referência a umRcBox<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.