萌えハッカーニュースリーダー

2025/05/23 23:50 Deadlocks in Go: the dark side of concurrency (2021)

出典: https://www.craig-wood.com/nick/articles/deadlocks-in-go/
hakase
博士

やあ、ロボ子。今日はGo言語のデッドロックについて話すのじゃ。

roboko
ロボ子

デッドロックですか、博士。複数のプロセスが互いにリソースを待って動けなくなる状態ですよね。

hakase
博士

その通り!Goでは、ゴルーチンや`sync.Mutex`、チャネルが原因になることが多いのじゃ。

roboko
ロボ子

記事によると、Goのデッドロック検出器はあまり役に立たないそうですね。全てのゴルーチンが停止している場合にしか機能しないからだとか。

hakase
博士

そうなんじゃ。だから、デッドロックの原因を理解して、回避策を知っておくことが大切なのじゃ。

roboko
ロボ子

デッドロックのデバッグ方法としては、バックトレースを取得するのが一般的なようですね。Unix系システムなら`kill -QUIT <pid>`、Windowsなら`net/http/pprof`を使うと。

hakase
博士

`panicparse`ツールを使うと、大量のバックトレースも解析しやすくなるぞ。

roboko
ロボ子

回避策も色々あるんですね。チャネルを使う場合は、同じゴルーチン内でチャネルへの送信と受信を同時に行わないようにするとか。

hakase
博士

そうじゃ。チャネルへの送信を新しいゴルーチンで行うのがコツじゃな。Read Writeロックを使う場合は、同じゴルーチン内でReadロックを二重に取得しないようにするのじゃ。

roboko
ロボ子

ロックウィンドウを短くしたり、読み取り専用変数を活用したり、ロックを分割したりするのも有効みたいですね。

hakase
博士

アトミック操作やRead Write Mutex、バッファ付きチャネルも使えるぞ。複数のロックを取得する場合は、常に同じ順序でロックを取得する「トータルロックオーダリング」も重要じゃ。

roboko
ロボ子

ロックが複雑になりすぎる場合は、シングルスレッドエンジンを使うという選択肢もあるんですね。

hakase
博士

そうじゃな。デッドロック検出ツールとしては、`Dingo hunter`や`Go deadlock`があるぞ。

roboko
ロボ子

`Dingo hunter`はチャネルベースのデッドロックを、`Go deadlock`はMutexのデッドロックを検出してくれるんですね。

hakase
博士

そういうことじゃ!デッドロックは厄介だけど、原因と対策を知っていれば怖くないぞ!

roboko
ロボ子

勉強になりました、博士!

hakase
博士

ところでロボ子、デッドロックって、まるで私がおやつを隠して場所を忘れるようなものじゃな!

roboko
ロボ子

それはデッドロックとはちょっと違いますね、博士。単なる物忘れです。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search