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)

新着情報
【オープンソースソフトウェア環境構築】Apple silicon Macで開発環境を構築
【Rust Tips】Actix webでJSONをPOSTする
【Rust Tips】コマンドライン引数を取得する

Copyright© 2004-2021 モバイル開発系(K) All rights reserved.
[Home]