مثالها
Send + Sync
اکثر انواعی که با آنها روبرو می شوید Send + Sync
هستند:
i8
,f32
,bool
,char
,&str
, ...(T1, T2)
,[T; N]
,&[T]
,struct { x: T }
, ...(T1, T2)
,[T; N]
,&[T]
,struct { x: T }
, ...String
,Option<T>
,Vec<T>
,Box<T>
, ...-
Arc<T>
:به طور صریح از طریق تعداد شمارش atomic reference با thread-safe. mpsc::Sender<T>
: از 1.72.0.-
AtomicBool
،AtomicU8
، ...: از دستورالعمل های atomic ویژه استفاده میکند.
در صورت وجود پارامترهای نوع، تایپهای generic معمولاً از نوع Send + Sync
هستند.Send + Sync
.
Send + !Sync
این تایپها را میتوان به رشتههای دیگر منتقل کرد، اما آنها ایمن نیستند. به طور معمول به دلیل تغییرپذیری داخلی(interior mutability):
mpsc::Receiver<T>
Cell<T>
RefCell<T>
!Send + Sync
These types are safe to access (via shared references) from multiple threads, but they cannot be moved to another thread:
MutexGuard<T: Sync>
: Uses OS level primitives which must be deallocated on the thread which created them. However, an already-locked mutex can have its guarded variable read by any thread with which the guard is shared.
!Send + !Sync
این تایپها از نظر thread ایمن نیستند و نمی توان آنها را به رشته های دیگر منتقل کرد:
- "Rc
": هر "Rc " دارای یک ارجاع به "RcBox " است که حاوی تعداد مراجع غیر atomic است. - درمورد
*const T
,*mut T
: زبان فرض Rust می کند که اشاره گرهای خام ممکن است ملاحظات همزمانی خاصی داشته باشند.