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

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

王林
王林転載
2024-02-08 20:50:13917ブラウズ

所有 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 までご連絡ください。