このコードでは「デッドロック」エラーが生成されないのはなぜですか?
提供されたコードには net/http パッケージのインポート ステートメントが含まれていますが、その関数は呼び出されません。それにもかかわらず、「デッドロック」エラー メッセージは生成されません。
説明
ネット パッケージをインポートすると、デッドロック検出機能を効果的に無効にするバックグラウンド ポーリングのゴルーチンが初期化されます。デッドロック検出器は、チャネルがデータを受信していないときを検出するランタイムの機能に依存しています。ただし、バックグラウンド ポーリングのゴルーチンは断続的なチャネル アクティビティを生成するため、デッドロック検出器が騙され、デッドロックが報告されなくなります。
例
次のコードを考えてみましょう。
package main import ( "fmt" "net/http" ) func main() { var ch = make(chan int) ch <- 1 }
net/http インポートが削除された場合、チャネルは別の Goroutine からデータをまったく受信しないため、コードは予想される「デッドロック」エラーを生成します。ただし、net/http インポートが存在する場合、バックグラウンド ポーリング ゴルーチンは、デッドロック エラーが報告されるのを防ぐために必要なチャネル アクティビティを提供します。
続きを読む
この動作これについては、GitHub の次の号で詳しく説明されています: https://github.com/golang/go/issues/12734
以上がnet/http パッケージをインポートしているにもかかわらず、提供されたコードで「デッドロック」エラーが回避されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。