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を通じた変更を可能にします。 -
MutexGuardはDerefとDerefMutを実装しているため、自然にアクセスできます。mutex をロックし、ガードを&mut Tのように使います。 -
mutex は
MutexGuard::drop()によって解放されます。明示的なアンロック関数を呼び出すことはありません。