2016-08-17 13 views
1

ワークスティールスレッドプールシステムでは、各ワークアイテムがスレッドローカルワークキュー内で新しいタスクを生成することがあり、フルの場合はグローバルキューにこぼれ落ちる可能性があります。ワークスティールスレッドプールを正しくシャットダウンする

このようなシステムのシャットダウンを安全かつ効率的に調整するにはどうすればよいですか?基本的なアトミック操作とクリティカルセクションロックが利用できると仮定します。

さらに明確にして簡略化します。各スレッドがローカルワークキューのみからタスクを取得しているとします(単純化するために他のスレッドキューを盗むことはありません)。ローカルワークキューが使い果たされている場合、グローバルワークキューをロックしてローカルワークキューに追加する作業を奪います。ローカルワークキューは、各ワーカースレッドに固有のロックを必要としません。

「アクティブな」ワーカースレッドの単純なフラグまたはアトミックカウントを使用すると、他のワーカーが別のワーカースレッドビューから新しいワークをグローバルキューに流出させる可能性があるため、機能しません仕事を辞めました。

すべての作業者は、作業が残っていない場合にのみ終了する必要があります。

+1

私はそれが広すぎるので質問を閉じるように投票しました。私はあなたの質問に集中し、これまでに試したことを教えてくれると信じています。個人的なメモでは、私はおそらく "停止"フラグを立てて、すべてのスレッドに参加します。これはシャットダウンを約束するものではありません。既存のタスクは永遠に実行されるかもしれません(自分自身を呼び出すかもしれない)ので...フラグを公開し、自己更新タスク内でチェックします...私はスレッドプールIサーバー用に書きました。 – Myst

+0

申し訳ありませんが、私はそれがかなり具体的だと思います。停止フラグを立てることは、スレッド間の可視性がいつ保証されていないかに起因して、現在アクティブなワーカーの単純な原子カウントも機能しません。送信することによって無限ループを引き起こすタスクは、プールそのものではなくタスクの設計上の誤りになります。 – iam

+0

特定の質問をしてもそれほど幅広くないわけではありません。 「あまりにも広すぎる」とは、可能な答えを指します。あなたは「どのように...」を求めていますか。あなたは何が効いているかについて多くの意見を得るかもしれません。 "正しい"答えがありません。 – Myst

答えて

0

最大の要件は、保留中のタスクの状態を永続ストレージに保存できるように、各タスクの定義を保存することです。次に、 "stop"フラグ(mutexを付けて)を実装します。実行のためにプールからタスクを取得するメソッドは、そのフラグとそれが設定されている場合は、スレッドを待機させて再試行する「利用可能なタスクなし」の結果とは別の「作業スレッドの終了」指示を返します。スレッドは、その指示を受け取ると終了し、すべての作業スレッドが終了してプールを終了するまで、全体のプール管理スレッドは待機します。メインプログラムは、プールが終了してプール管理スレッドが終了するまで待たなければなりません。一旦それが起こると、プログラムを終了するのが安全です。プログラムを実行して後でプールを再起動する必要がある場合は、プールの構成に影響を与えるか、プールを再開する前に条件を満たす必要があります。

+0

私は保留中のタスクの状態を保存することがなぜ問題なのかよくわかりません。グローバルまたはローカルの作業キューにあるか、ワーカースレッド内の飛行中のレジスタです。今のところ、全体的なプール管理スレッドはありません - 同じワーカースレッドのプールだけです。問題は、作業者が実行しているタスクから新しいタスクを生成し、グローバルキューにこぼれ出す可能性があることです。従業員が単純なフラグやカウンタの使用を終了した可能性があると思われる問題が発生します。まだ残っています。 – iam

+0

@iamキューに作業があるか、キューに作業がありません。なぜ労働者は他の労働者が何をしているのか気にする必要がありますかあまりにも複雑なシステムが制御不能になっているようです。 –

+0

@iam正確に。スレッドが作業を生成するのを停止するか(タスクの途中で停止する必要がある可能性があることを意味する)、または新しい作業(キュー内の未起動タスクを意味する)を停止させるために、永続的な記憶域が必要です。作業スレッドが停止するのを待つ必要があるため、早期に終了して、すべて正常にシャットダウンしたかどうか、およびプールが安全かつ完全にシャットダウンしたかどうかを追跡する必要があるため、管理スレッドが必要です。 –