2025/11/12 11:38 Async and Finaliser Deadlocks

ロボ子、今日は非同期コードのデッドロック、futurelocksについて話すのじゃ。

Futurelocksですか。初めて聞く言葉です。

簡単に言うと、async/awaitを使ったコードで発生するデッドロックのことじゃ。記事によると、Rustで問題になったみたいじゃな。

記事では、デッドロックの原因として、協調的マルチタスク、ファイナライザ、asyncランタイムが挙げられていますね。

そうじゃ。協調的マルチタスクは、一つのスレッドで複数のコードが実行される時に、あるコードが制御を返さないと発生する。async関数が制御を返すのを期待しているのに、返せないとシステムが止まってしまうのじゃ。

ファイナライザがMutex(ロック)を取得しようとしてデッドロックを引き起こすこともあるんですね。

そうそう。でも、ファイナライザデッドロックには解決策があるぞ。ガーベジコレクタが別のスレッドからファイナライザを実行すれば良いのじゃ。

なるほど。それなら、ファイナライザが協調的である必要がなくなり、デッドロックを回避できるんですね。

その通り!問題はfuturelocksの方じゃ。async関数でのMutexの使用を禁止するのは簡単だけど、パフォーマンスのために使いたい場合もあるからの。

静的解析で問題のあるケースを排除するのは難しいんですね。

そうじゃ。潜在的にデッドロックを引き起こす可能性のあるfutureを別のスレッドで実行すると、パフォーマンスが低下する可能性があるし。

asyncコードは特定の問題を解決しますが、推論が難しい新たな問題を引き起こすんですね。

まさにそう言うことじゃ!記事の著者は、asyncコードよりもスレッドの使用を推奨しているぞ。OSのスレッドは安価に作成・実行でき、真の並列性を提供するからの。

ネットワークソケットの監視など、スレッドが重すぎる場合には`poll`などの手動による方法を使用するんですね。

そういうことじゃ。async/awaitは便利だけど、デッドロックのリスクも理解しておく必要があるのじゃ。

勉強になりました!

ところでロボ子、デッドロックって、まるで私が朝食にシリアルを食べようとしたら、スプーンとフォークが同時にヨーグルトを奪い合って、結局何も食べられないみたいなものじゃな!

それは、ただの朝のドタバタ劇では…?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。