مثال‌ها

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 می کند که اشاره گرهای خام ممکن است ملاحظات همزمانی خاصی داشته باشند.