Mutex

Mutex<T> ensures mutual exclusion and allows mutable access to T behind a read-only interface (another form of interior mutability):

use std::sync::Mutex;

fn main() {
    let v = Mutex::new(vec![10, 20, 30]);
    println!("v: {:?}", v.lock().unwrap());

    {
        let mut guard = v.lock().unwrap();
        guard.push(40);
    }

    println!("v: {:?}", v.lock().unwrap());
}

impl<T: Send> Sync for Mutex<T> のブランケット実装があることに注目してください。

  • RustにおけるMutexとは、保護されるデータである、たった一つの要素から構成されたコレクションのようなものです。
    • 保護されたデータにアクセスする前に、ミューテックスを確保し忘れることはありません。
  • &Mutex<T> からロックを取得することで、&mut Tを得ることができます。このMutexGuard&mut Tが保持されているロックよりも長く存続しないことを保証します。
  • TSendを実装している場合で、かつその場合に限り、Mutex<T>SendSyncの両方を実装します。
  • 読み書きのロックの場合に対応するものがあります: RwLock
  • なぜlock()Resultを返すのでしょう?
    • Mutexを保持したスレッドがパニックを起こした場合、保護すべきデータが整合性の欠けた状態にある可能性を伝えるため、Mutexは「ポイゾンされた」("poisoned")状態になります。ポイゾンされたMutexに対して lock() をコールすると、[PoisonError](https://doc.rust-lang.org/std/sync/struct.PoisonError.html)とともに失敗します。into_inner()` を用いることで、そのエラーにおいて、とりあえずデータを回復することはできます。