これは私の最初の投稿です。事前に寛容に感謝します。
ジョブ キュー >> スレッド数のスレッド プールがあります。
プロセスフロー:
- スレッドプールの初期化 (M 個のスレッド)
- N 個のタスクをキューに入れます ( N >> M にすることができます)
- スレッドはタスクの実行を開始します。現在のタスクスレッドが終了すると、次の利用可能なタスクが自動的に実行されます。
- 同期点 - すべてのタスクを完了する必要があります。
- データ処理 (シングルスレッド)
- 処理されたデータに基づいてタスクを生成するか、終了します
- 後藤2
問題は同期点です。カウンターとミューテックスを使用して単純なセマフォを実装しました。ステップ2の前に、ロードするタスクの数でカウンターが初期化され、各タスクが完了するとカウンターが減ります。カウンター == ゼロの場合、ワーカー スレッドから pthread_cond_signal を送信し、ステップ 4 の pthread_cond_wait がそれをキャッチします。
これを行うには最も効率的な方法ではないように感じます (カウンターのデクリメントのために各スレッドでロック/ロック解除するのは好きではありません。特にタスクのペイロードが小さい場合は大きなオーバーヘッドになります) が、改善方法がわかりません。バリアについては認識していますが、同期イベントが発生する前にスレッドを複数回再利用する必要があるため、スレッドで pthread_barrier_wait を実行できません。
キュー内のタスク数に対する pthread_spin_lock ? キューが空であっても、スレッドが実行されていないという意味ではありません。スレッドは最後の M タスクにある可能性があります。スレッドは次のサイクルで再利用されるため、スレッドを結合できません。
入力/アイデアをいただければ幸いです。ありがとうございました。