すべてのゴルーチンがスリープ状態です - デッドロック、バッファリングされたチャネル上で、理由がわかりません

王林
リリース: 2024-02-08 20:50:13
転載
902 人が閲覧しました

所有 goroutine 都在睡觉 - 死锁,在缓冲通道上,不明白为什么

質問の内容

一定数の go ルーチンだけ (たとえば 5 つ) を作成したいのですが、ジョブの数は可変です。

これがこれを実行しようとするコードです。テストはその下にあります。

リーリー

これをテストします

リーリー

テスト jobs 10 Capacity 5 は機能しますが、jobs 100 Capacity 5 は失敗します。

100 ジョブに対してキャパシティ 50 を設定すると機能しますが、30 ジョブに対しては機能せず、動作が理解できません。

以下は、このチャネルについての私の理解と、それが機能するという私の期待です。

バッファ チャネルがいっぱいの場合、空き容量が利用可能になるまでブロックされます。ジョブ チャネルがいっぱいになると、チャンワーカーがジョブ チャネルの一部を解放するまでブロックされることが予想されます。チャンワーカー自体は容量を受け取り、空の構造体を使用して、ワーカー スレッドが 5 つ以下しか作成されないようにします。

エラーが発生するのはなぜですか? 致命的エラー: すべてのゴルーチンがスリープ状態です - デッドロック! ?


正解


すべてのジョブが jobs# に送信されるまで、メインの goroutine は results から値を受け取りません。 ##、したがって、ワーカー スレッドは results への送信中にブロックされます。ジョブがブロックされているため、メインの goroutine は jobs への送信をブロックします。デッドロック!

ゴルーチンを使用して作業を行うことで修正されました。

リーリー

https://www.php.cn/link/6e04df31f1bbb1c02666d0dfa3638f76

以上がすべてのゴルーチンがスリープ状態です - デッドロック、バッファリングされたチャネル上で、理由がわかりませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!