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
が保持されているロックよりも長く存続しないことを保証します。T
がSend
を実装している場合で、かつその場合に限り、Mutex<T>
はSend
とSync
の両方を実装します。- 読み書きのロックの場合に対応するものがあります:
RwLock
。 - なぜ
lock()
はResult
を返すのでしょう?- Mutex
を保持したスレッドがパニックを起こした場合、保護すべきデータが整合性の欠けた状態にある可能性を伝えるため、
Mutexは「ポイゾンされた」("poisoned")状態になります。ポイゾンされたMutexに対して
lock()をコールすると、[
PoisonError](https://doc.rust-lang.org/std/sync/struct.PoisonError.html)とともに失敗します。
into_inner()` を用いることで、そのエラーにおいて、とりあえずデータを回復することはできます。
- Mutex