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