Mutexでスレッドを同期させる他の言語でスレッドを同期させるとき、Mutexを使うことがある。RustでもMutexが用意されている。 Mutexのlock()はロックを獲得できるまでブロックする。獲得したロックはクロージャのスコープを抜けることで自動的に解放されるようだ。MutexはArcでラップすることで複数スレッドで共有可能にする必要がある。 use std::thread; use std::sync::{Arc, Mutex}; fn main() { let counter = Arc::new(Mutex::new(0)); let mut handles = vec![]; for i in 0..10 { // counterを複数スレッドで共有可能にする let counter_clone = Arc::clone(&counter); handles.push(thread::spawn(move || { let mut num = counter_clone.lock().unwrap(); *num += 1; println!("i: {} counter: {}", i, num); })); } for handle in handles { handle.join().unwrap(); } println!("メインスレッド {}", *counter.lock().unwrap()); } 上記のコードを実行すると以下のような結果が得られる。スレッドの実行順序はspawnした順序にはならないが、counterの値は1スレッド辺り1増加し、最終的に10になる。 i: 1 counter: 1 i: 2 counter: 2 i: 0 counter: 3 i: 5 counter: 4 i: 4 counter: 5 i: 3 counter: 6 i: 6 counter: 7 i: 7 counter: 8 i: 8 counter: 9 i: 9 counter: 10 メインスレッド 10 (2021/01/15)
Copyright© 2004-2021 モバイル開発系(K) All rights reserved.
[Home]
|