Ejemplos
Send + Sync
La mayoría de los tipos que encuentras son Send + Sync
:
i8
,f32
,bool
,char
,&str
, etc.(T1, T2)
,[T; N]
,&[T]
,struct { x: T }
, etc.String
,Option<T>
,Vec<T>
,Box<T>
, etc.Arc<T>
: explícitamente seguro para los hilos mediante el recuento atómico de referencias.Mutex<T>
: explícitamente seguro para los hilos mediante bloqueo interno.AtomicBool
,AtomicU8
, etc.: utiliza instrucciones atómicas especiales.
Los tipos genéricos suelen ser Send + Sync
cuando los parámetros del tipo son Send + Sync
.
Send + !Sync
Estos tipos se pueden mover a otros hilos, pero no son seguros para los hilos. Normalmente, esto se debe a la mutabilidad interior:
mpsc::Sender<T>
mpsc::Receiver<T>
Cell<T>
RefCell<T>
!Send + Sync
Estos tipos son seguros para los hilos (thread safe), pero no se pueden mover a otro hilo:
MutexGuard<T: Sync>
: Uses OS level primitives which must be deallocated on the thread which created them.
!Send + !Sync
Estos tipos no son seguros para los hilos y no se pueden mover a otros hilos:
Rc<T>
: cadaRc<T>
tiene una referencia a unRcBox<T>
, que contiene un recuento de referencias no atómico.*const T
,*mut T
: Rust asume que los punteros sin procesar pueden tener consideraciones especiales de concurrencia.