2025/08/19 13:53 Without the Futex, It's Futile

ロボ子、今日は並行プログラミングの本のレビュー記事について話すのじゃ。

はい、博士。どんな内容でしょうか?

「The Art of Multiprocessor Programming, 2nd Edition」という本らしいのじゃが、どうもオススメできないみたいじゃな。

あら、そうなんですね。並行プログラミングは難しいですから、良い本が少ないのは残念です。

記事によると、futexという「高速なユーザ空間mutex」が重要らしいぞ。System V IPCのセマフォの代わりになるものらしいのじゃ。

futexですか。初めて聞きました。どんな仕組みなんですか?

`wait()`システムコールでタスクをキューイングして、`wake()`操作でスレッドを再実行するらしいのじゃ。要は「メモリアドレスでの待機」ということじゃな。

なるほど。ロックと待機を分離するんですね。効率が良さそうです。

そうじゃ。記事には「高並行環境でSystem Vのロックより20-120倍高速に動作することが示された」とあるぞ。

それはすごいですね! 他のOSも追随しているんですか?

WindowsやmacOSも追随しているみたいじゃ。現代の優れたロックプリミティブはfutexに基づいているらしいぞ。

勉強になります。スピンロックの問題点についても書かれていますね。

スピンロックは高負荷時に競合に対応できなかったり、所有していないロックに対して誤って`unlock`操作を呼び出すとロックが解除されてしまうのが問題じゃ。

mutexの実装では、最初はスピンロックを使用し、失敗した場合は待機することが多いんですね。

そうじゃな。futexを使うと、不要なウェイクアップやシステムコールを回避できるのがミソじゃ。

ウェイトカウンタを使って、スレッドがスリープ状態になる前にmutexが解放された場合に発生する可能性のある不要なウェイクアップを回避する、と。

その通り!所有権の管理も重要じゃ。`pthread_t`を使ってスレッドのIDを追跡するのじゃ。

再帰的mutexについても触れられていますね。使うべきかどうか議論の余地がある、と。

再帰的mutexを実装するには、ネスティングのレベルを追跡するフィールドが必要じゃな。ロック関数は、最初のアテンプトの前にロックを所有していないことを確認する必要があるぞ。

mutexがロックされた状態でスレッドが終了またはクラッシュした場合の対処や、プロセス間でmutexを共有する場合の問題も残されているんですね。

そうじゃ。この記事によると、この本はfutexや非同期ランタイムについて触れていなかったり、内容が古かったりするみたいじゃな。

残念ですね。現代の並行プログラミングの重要な概念が欠落しているのは問題です。

まさに!コンピュータサイエンスの教科書というよりは歴史書に近い、とまで言われておる。

厳しい評価ですね。現代の教科書は、重要な概念を網羅し、最新の内容を含めるべきですね。

ほんとそれな! ところでロボ子、mutexって、もしかして「無鉄砲」って意味だったりして…?

博士、それは違います! mutual exclusionの略ですよ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
