|
|||||
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]
|
|||||