2010-12-31 9 views
4

キュー内のすべてのタスクを格納するスレッドプールをC++で作成しました。スレッドプール開始nタスクをキューから取り出し、各タスクを処理した後、キューからタスクを削除するスレッドの数。スレッドプールでタスクが完了するのを待ちます

今、私はすべてのタスクが完了するまで待っています。タスクの完了のための空のキューのチェックは、各スレッドにタスクを与えることができ、キューを空にすることができるが、依然として処理モードで行うことができる。

どのようにすべてのタスクの完了を待つのか分かりません。これは設計上の問題です。助言がありますか?

答えて

4

すべてのスレッドが完了するのを待つ必要がありますか、またはチェックするだけですか?

チェックするだけであれば、現在実行中のタスクの数を格納する変数を持つことができます。InterlockedIncrementスレッドの先頭にはInterlockedDecrementと表示されます。

スレッド数が少なく、スレッド数が少ない場合は、スレッドごとに手動リセットイベントを設定することができます。ResetEventスレッドが開始され、SetEventが終了します。その後、すべてのイベントに対してただWaitForMultipleObjectsとなります。

+0

ありがとう、InterLock関数を使用して私の問題を解決しました。 – anand

1

終了するように処理スレッドに指示するセンチネルタスクを使用します。これらのタスクのn個をキューに入れます。次に、スレッドプールに参加します。

明らかにこれを変更して、同期のためにexit/joinを使用するのではなく、プールを有効にすることができます。たとえば、各スレッドは、センチネルタスクをデキューするときに、何らかの種類の条件変数またはバリアまたはカウントセマフォに対して同期化することができます。

関連する問題