Mutex と MutexGuard

以前の例では、RAII はファイルディスクリプターのような具体的なリソースを管理するために使われていました。Mutex では、「リソース」は値への可変アクセスです。値にアクセスするには lock を呼び出します。すると MutexGuard が返され、これがドロップされると Mutex のロックが自動的に解除されます。

// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0

use std::sync::Mutex;

fn main() {
    let m = Mutex::new(vec![1, 2, 3]);

    let mut guard = m.lock().unwrap();
    guard.push(4);
    guard.push(5);
    println!("{guard:?}");
}
  • Mutex は、ある値への排他的なアクセスを制御します。以前の RAII の例とは異なり、ここでのリソースは論理的なものであり、内部のデータへの一時的な排他的アクセスです。

  • この権利は MutexGuard によって表されます。この mutex に対するガードは、一度に 1 つしか存在できません。ガードが生存している間は、&mut T アクセスを提供します。

  • lock()&self を受け取りますが、可変アクセスを持つ MutexGuard を返します。これは interior mutability によって実現されており、型が自身の借用規則を内部的に管理することで、&self を通じた変更を可能にします。

  • MutexGuardDerefDerefMut を実装しているため、自然にアクセスできます。mutex をロックし、ガードを &mut T のように使います。

  • mutex は MutexGuard::drop() によって解放されます。明示的なアンロック関数を呼び出すことはありません。