1

最大 M 個のワーカー スレッドを生成するボス スレッドがあります。プログラムの存続期間中に、ワーカーが追加および削除される場合があります。プログラム全体のシャットダウン フラグが通知されたら、これらのワーカーの完了を待ちたいと思います。

現在、どのスレッドでもスレッドを追加/削除できますが、任意のスレッドがスポーン/削除を開始できる限り、厳密には必須ではありません。

カウントセマフォの使用を妨げpthread_barrier_wait()ているのは、固定数のスレッドが必要なためです。

すべてのワーカーをループpthread_join()することもできません。これは、終了してから置き換えられた可能性のあるゾンビ スレッドがリークする危険があるためです。

Boss スレッド自体には、最初にスレッドを生成し、プロセスが正常に終了することを確認する以外の目的はありません。

私はこの問題に何日も費やしてきましたが、堅牢でシンプルなものを思いつくことはできません。POSIXスレッドでこれを達成するためのかなり確立された方法はありますか?

4

3 に答える 3

3

1)「現在、どのスレッドでもスレッドを追加/削除できます」

2)「POSIXスレッドでこれを達成するためのかなり確立された方法はありますか」

はい。しないでください(1)。ボススレッドにそれをさせてください。

または、スレッドを生成するコードをクリティカル セクションまたはミューテックスで保護することもできます (既にこれを行っていると思います)。フラグをチェックして、シャットダウンが進行中かどうかを確認する必要があります。進行中の場合は、それ以上スレッドを生成しないでください。

また、「理想的なスレッド数」と「実際のスレッド数」のカウンターを持ち、「理想的 > 実際のスレッド」が見つかった場合にスレッドを自殺させることもできます。(つまり、実際の値を減らし、クリティカル セクション/ミューテックスを終了してから終了する必要があります)。

シャットダウンを開始する必要がある場合は、SAME ミューテックス/セクションを使用してフラグを設定します。完了したら、スレッドの数を増やすことができないことがわかっているので、最新の値を使用できます。

実際、終了するには、ボス スレッドを「理想的」にゼロに設定し、ミューテックスを終了し、繰り返し 10 ミリ秒スリープし、すべてのスレッドが終了するまで繰り返します。最悪の場合、終了するまでさらに 10 ミリ秒待機します。それが多すぎる場合は、1ms にカットしてください。

これらは単なるアイデアです。中心的な概念は、すべてのスレッドの作成/削除、およびスレッドの作成/削除に関するメッセージをミューテックスで保護して、一度に 1 つのスレッドのみがステータスを追加/削除/クエリするようにすることです。それができたら、それを行う方法は複数あります...

于 2013-10-29T21:19:48.977 に答える
2

スポーン/削除を開始したいスレッドは、ボススレッドに実際にそれを行うよう依頼する必要があります。次に、ボススレッドは、知らないスレッドについて心配する必要がなく、質問で説明した簡単な方法のいずれかを使用できます。

于 2013-10-29T21:26:39.233 に答える
1

私は時々これをしなければならないので、他の答えのいくつかとは反対の戦術を取ります。

(1) 生成されたすべてのスレッドが、渡されたデータを介して、pthread_createまたはグローバルに単一のパイプ ファイル記述子にアクセスできるようにします。ボスねじのみがパイプを読み取ります。各スレッドは、tid を渡すことでパイプを介してボスに作成と終了をアナウンスし、ボスは必要に応じてそのリストにスレッドを追加または削除しpthread_joinsます。ボスは、特別なことをしなくてもパイプをブロックできます。

(2) 多かれ少なかれ、他のメカニズムで上記を実行します。ボスをウェイクアップするための条件変数を伴うグローバル ctr とリスト。メッセージキューなど

于 2013-10-29T22:00:33.950 に答える