問題一覧に戻る
上級並行性
問題89: Mutex
Mutex(相互排他)は一度に一つのスレッドだけがデータにアクセスできるよう保証します。lock()メソッドはデータへのアクセスを提供するMutexGuardを返します。ガードはドロップ時に自動的にロックを解放。try_lock()はブロックせずに取得を試みます。スレッドがロック保持中にパニックすると、データ破損を防ぐためMutexは「汚染」されます。
use std::sync::;
use std::thread;
fn main() {
// Mutexの作成
let counter = ::new(0);
{
// Mutexをロック
let mut num = counter.().unwrap();
*num += 1;
} // ガードがドロップされロック解放
// try_lockを使用
match counter.() {
Ok(mut num) => *num += 1,
Err(_) => println!("Failed to lock"),
}
// ポイズンされたMutex
let result = thread::spawn(move || {
let mut num = counter.lock().unwrap();
*num += 1;
panic!("Oh no!");
}).join();
if result. {
println!("Thread panicked");
}
}