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> のブランケット実装があることに注目してください。

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