Dev Study
Rust コース

50. Mutex と Arc — 共有状態を安全に更新する

複数のスレッドで同じ値を書き換えたいときは Mutex<T> で包みます。lock().unwrap() でロックを取ると中身への書き換え可能なアクセスが得られ、その値がスコープを抜けると自動でロックが解放されます。ロックを持てるのは同時に1スレッドだけなので、更新が混ざって壊れることがありません。

Mutex を複数のスレッドに渡すには所有者を増やす必要がありますが、Rc<T> はシングルスレッド専用なのでここでは使えません。代わりにスレッド間で安全に共有できる Arc<T>(アトミック参照カウント)で包み、各スレッドに Arc::clone を渡します。Arc<Mutex<T>> は「共有カウンタ」「共有キャッシュ」など、複数スレッドで状態を持つときの定番の組み合わせです。

lock で取った値を長く持ち続けると他のスレッドを待たせてしまい、互いにロックを待ち合うとデッドロックになります。ロックを取る範囲はできるだけ短くするのがコツです。

▶ サンプルコードを実行してみよう(自由に書き換えてOK)

Rust
サンプルコードで身につける(5本) →

学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。

公式ドキュメントで詳しく ↗