Go チャネルとデッドロック
Go では、ゴルーチン間の通信にチャネルが使用されます。ただし、チャネルが適切に処理されない場合、デッドロックが発生する可能性があります。
次のコードを考えてみましょう。
<code class="go">func main() { c1 := make(chan int) c2 := make(chan int) go func() { for i := range c1 { println("G1 got", i) c2 <- i } }() go func() { for i := range c2 { println("G2 got", i) c1 <- i } }() c1 <- 1 time.Sleep(1000000000 * 50) }</code>
このコードは、main 関数が終了するまで無限に数値を出力します。ただし、メイン関数からチャネルの 1 つに別の値を送信すると、プログラムはブロックします:
<code class="go">func main() { c1 := make(chan int) c2 := make(chan int) go func() { for i := range c1 { println("G1 got", i) c2 <- i } }() go func() { for i := range c2 { println("G2 got", i) c1 <- i } }() c1 <- 1 time.Sleep(1000000000 * 1) c1 <- 2 time.Sleep(1000000000 * 50) }</code>
これは、2 番目のゴルーチンが c1 に送信された値 "2" を受信しないために発生します。このデッドロックの理由は、2 つのゴルーチンがお互いに値の送受信を待機しており、循環依存関係が作成されていることです。
デッドロックのデバッグ
デッドロックをデバッグするには、いくつかのアプローチを使用できます。
以上がGo チャネルでデッドロックがどのように発生するのか、またそのデバッグ方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。