問題一覧に戻る
上級並行性
問題91: Condvar(条件変数)

Condvarはスレッドが条件を待機し、互いに通知し合うことを可能にします。Mutexと組み合わせてスレッド実行を調整。wait()はMutexを解放して通知までブロックし、その後ロックを再取得。notify_one()は一つの待機スレッドを起床、notify_all()は全てを起床。プロデューサーコンシューマーパターンやスレッド同期に不可欠です。

use std::sync::{Arc, Mutex, };
use std::thread;

fn main() {
// 条件変数の作成
let pair = Arc::new((Mutex::new(false), ::new()));
let pair2 = Arc::clone(&pair);

// 待機スレッド
thread::spawn(move || {
let (lock, cvar) = &*pair2;
let mut started = lock.lock().unwrap();
while !*started {
// 条件を待機
started = cvar.(started).unwrap();
}
println!("Thread: Started!");
});

thread::sleep(std::time::Duration::from_millis(100));

// 通知スレッド
{
let (lock, cvar) = &*pair;
let mut started = lock.lock().unwrap();
*started = true;
// 一つのスレッドに通知
cvar.();
}

thread::sleep(std::time::Duration::from_millis(100));
}