問題一覧に戻る
上級並行性
問題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");
}
}