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>: 1.72.0 以降。
  • AtomicBool, AtomicU8, …: 特別なアトミック命令を使用します。

ジェネリック型は、型パラメータが Send + Sync であれば、通常 Send + Sync です。

Send + !Sync

これらの型は他のスレッドに移動できますが、スレッドセーフではありません。 通常は、内部可変性があるためです:

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

!Send + Sync

これらの型は複数のスレッドから(共有参照を介して)安全にアクセスできますが、 別のスレッドに移動することはできません:

  • MutexGuard<T>: 作成したスレッド上で解放しなければならない OS レベルの プリミティブを使用します。ただし、すでにロックされている mutex では、 ガードが共有されている任意のスレッドが、その保護対象の変数を読み取ることが できます(ただし T 自体が !Sync の場合を除きます)。

!Send + !Sync

これらの型はスレッドセーフではなく、他のスレッドに移動することもできません:

  • Rc<T>: 各 Rc<T>RcBox<T> への参照を持っており、その中には 非アトミックな参照カウントが含まれています。
  • *const T, *mut T: Rust は、生ポインタには特別な並行性に関する考慮事項が ある可能性があると想定しています。