← Rust コース
50. Mutex と Arc — 共有状態を安全に更新する
複数のスレッドで同じ値を書き換えたいときは Mutex<T> で包みます。lock().unwrap() でロックを取ると中身への書き換え可能なアクセスが得られ、その値がスコープを抜けると自動でロックが解放されます。ロックを持てるのは同時に1スレッドだけなので、更新が混ざって壊れることがありません。
Mutex を複数のスレッドに渡すには所有者を増やす必要がありますが、Rc<T> はシングルスレッド専用なのでここでは使えません。代わりにスレッド間で安全に共有できる Arc<T>(アトミック参照カウント)で包み、各スレッドに Arc::clone を渡します。Arc<Mutex<T>> は「共有カウンタ」「共有キャッシュ」など、複数スレッドで状態を持つときの定番の組み合わせです。
lock で取った値を長く持ち続けると他のスレッドを待たせてしまい、互いにロックを待ち合うとデッドロックになります。ロックを取る範囲はできるだけ短くするのがコツです。
▶ サンプルコードを実行してみよう(自由に書き換えてOK)
Rust
サンプルコードで身につける(5本) →
学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。
公式ドキュメントで詳しく ↗