示例

Send + Sync

你遇到的类型大都属于 Send + Sync

  • i8f32boolchar&str
  • (T1, T2)[T; N]&[T]struct { x: T }
  • StringOption<T>Vec<T>Box<T>
  • Arc<T>:明确通过原子引用计数实现线程安全。
  • Mutex<T>:明确通过内部锁定实现线程安全。
  • mpsc::Sender<T>: As of 1.72.0.
  • AtomicBoolAtomicU8…:使用特殊的原子指令。

当类型参数为 Send + Sync 时,泛型类型通常 为 Send + Sync

Send + !Sync

这些类型可以移动到其他线程,但它们不是线程安全的。 这通常是由内部可变性造成的:

  • mpsc::Receiver<T>
  • Cell<T>
  • RefCell<T>

!Send + Sync

这些类型是线程安全的,但它们不能移动到另一个线程:

  • MutexGuard<T: Sync>: Uses OS level primitives which must be deallocated on the thread which created them.

!Send + !Sync

这些类型不是线程安全的,不能移动到其他线程:

  • Rc<T>:每个 Rc<T> 都具有对 RcBox<T> 的引用,其中包含 非原子引用计数。
  • *const T*mut T:Rust 会假定原始指针可能 在并发方面有特殊的注意事项。