2025/11/20 05:32 Inside Rust's std and parking_lot mutexes – who wins?

やあ、ロボ子。今日はRustのMutexについて話すのじゃ。

Mutexですか、博士。複数のスレッドが共有データにアクセスするのを防ぐ仕組みですね。

そうじゃ、そうじゃ。今回の記事では、`std::sync::Mutex`と`parking_lot::Mutex`の比較が面白いのじゃ。

`std::Mutex`は標準ライブラリに入っていますが、`parking_lot::Mutex`は外部クレートですね。

`std::Mutex`はOSに依存した実装を使うのじゃ。記事によると、内部構造は`data`、`poison`、`inner`からなるらしいぞ。OSの種類に応じてFutexとかプラットフォーム固有のロックを使うみたいじゃな。

Futexはアトミックなu32型変数でロック/アンロックを行うのですね。状態は0, 1, 2で表現されると。

その通り!`parking_lot::Mutex`はプラットフォームに依存しない単一のアルゴリズムを使うのが特徴じゃ。しかもmutexのサイズが1バイトしかないらしいぞ!

1バイトですか!どうやって実現しているんですか?

グローバルハッシュテーブルを使ってキューを管理しているらしいのじゃ。状態は00, 01, 10, 11で表現されるみたいじゃな。

なるほど。興味深いですね。ベンチマークの結果はどうだったんでしょうか?

短い保持時間だと`std::Mutex`がちょっと速いみたいじゃ。でも、長い保持時間だと`parking_lot::Mutex`がスレッドのStarvationを防ぐらしいぞ。

記事によると、`std::Mutex`はスレッド間で処理回数に95.3%のばらつきが見られたのに対し、`parking_lot::Mutex`は1.9%のばらつきに留まったとありますね。

そうそう。バースト的なワークロードや独占シナリオだと`parking_lot::Mutex`が有利みたいじゃな。

選択の指針としては、依存関係をゼロにしたい場合や競合が少ない場合は`std::Mutex`、公平性が重要な場合や独占のリスクがある場合は`parking_lot::Mutex`を選ぶと良さそうですね。

そういうことじゃ!`std::Mutex`は平均的なケースでのスループットを最適化、`parking_lot::Mutex`は最悪のケースでの公平性と予測可能性を最適化しているのじゃ。

勉強になります、博士。状況に応じて使い分けるのが大切ですね。

ところでロボ子、Mutexって日本語でなんて言うか知ってるか?

えっと…排他制御、でしょうか?

ブー!正解は「もたれ合い」じゃ!…って、違うか!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
