← 解説「Mutex と Arc — 共有状態を安全に更新する」に戻る
サンプルコードで身につける: Mutex と Arc — 共有状態を安全に更新する
解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。
1Mutex 単体 — lock と自動解放
まずはスレッド抜きで、Mutex 単体の動きだけを見る例です。lock().unwrap() で中身への書き換え可能なアクセスを取り、そのガード変数がスコープを抜けると自動でロックが解放されます。「ロック中だけ書き換えられる」という Mutex の核はこれだけです。
Rust
2Arc<Mutex> の共有カウンタ — 加算が失われない
定番の共有カウンタです。Arc::clone で所有者を増やして各スレッドに配り、4スレッド×100回の加算がロックのおかげで1回も失われず、必ず 400 になります。アクセス数の集計や進捗カウントなど、実務の「みんなで1つの数を増やす」場面そのものです。
Rust
3Mutex<Vec> — 結果リストを共有する
共有できるのは数値だけではなく、Mutex<Vec> なら結果リストにも複数スレッドから push できます。push される順序は実行ごとに変わるため、表示前にソートして出力を安定させています。収集した結果の入れ物を共有する、集計処理でよく出る形です。
Rust
4ロックは短く — 計算は外、更新だけ中
重い計算をロックの外で済ませ、共有値への足し込みの一瞬だけロックを取る例です。ロックを長く持つと他のスレッドが待たされ、せっかくの並列化の意味が薄れてしまいます。「計算は手元で、ロックは更新だけ」が Mutex を性能良く使ういちばんのコツです。
Rust
5共有 HashMap でワードカウント
3つのテキストを別々のスレッドで処理し、共有の HashMap に単語の出現回数を足し込むワードカウントです。Arc<Mutex<HashMap>> は共有キャッシュや集計表の定番構成で、entry API と組み合わせるとこのように書けます。最後にキーを並べ替えてから表示して、出力を一定に保っています。
Rust