ワークスティールスレッドプールシステムでは、各ワークアイテムがスレッドローカルワークキュー内で新しいタスクを生成することがあり、フルの場合はグローバルキューにこぼれ落ちる可能性があります。ワークスティールスレッドプールを正しくシャットダウンする
このようなシステムのシャットダウンを安全かつ効率的に調整するにはどうすればよいですか?基本的なアトミック操作とクリティカルセクションロックが利用できると仮定します。
さらに明確にして簡略化します。各スレッドがローカルワークキューのみからタスクを取得しているとします(単純化するために他のスレッドキューを盗むことはありません)。ローカルワークキューが使い果たされている場合、グローバルワークキューをロックしてローカルワークキューに追加する作業を奪います。ローカルワークキューは、各ワーカースレッドに固有のロックを必要としません。
「アクティブな」ワーカースレッドの単純なフラグまたはアトミックカウントを使用すると、他のワーカーが別のワーカースレッドビューから新しいワークをグローバルキューに流出させる可能性があるため、機能しません仕事を辞めました。
すべての作業者は、作業が残っていない場合にのみ終了する必要があります。
私はそれが広すぎるので質問を閉じるように投票しました。私はあなたの質問に集中し、これまでに試したことを教えてくれると信じています。個人的なメモでは、私はおそらく "停止"フラグを立てて、すべてのスレッドに参加します。これはシャットダウンを約束するものではありません。既存のタスクは永遠に実行されるかもしれません(自分自身を呼び出すかもしれない)ので...フラグを公開し、自己更新タスク内でチェックします...私はスレッドプールIサーバー用に書きました。 – Myst
申し訳ありませんが、私はそれがかなり具体的だと思います。停止フラグを立てることは、スレッド間の可視性がいつ保証されていないかに起因して、現在アクティブなワーカーの単純な原子カウントも機能しません。送信することによって無限ループを引き起こすタスクは、プールそのものではなくタスクの設計上の誤りになります。 – iam
特定の質問をしてもそれほど幅広くないわけではありません。 「あまりにも広すぎる」とは、可能な答えを指します。あなたは「どのように...」を求めていますか。あなたは何が効いているかについて多くの意見を得るかもしれません。 "正しい"答えがありません。 – Myst