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>
: 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.