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