次のように、ワーカースレッドのプールの一時停止メカニズムとしてセマフォを使用することを考えています。
// main thread
for N jobs:
semaphore.release()
create and start worker
// worker thread
while (not done)
semaphore.acquire()
do_work
semaphore.release()
ここで、すべてのワーカーを一時停止したい場合は、セマフォで使用可能なカウント全体を取得できます。私はそれがより良いと思っています:
if (paused)
paused_mutex.lock
wait for condition (paused_mutex)
do_work
または、より良い解決策はありますか?
セマフォでそれを行うことの1つの欠点は、すべてのワーカーが解放されるまでメインスレッドがブロックされることだと思います. 私の場合、反復ごとの作業単位は非常に小さいため、おそらく問題にはなりません。
更新: 明確にするために、私のワーカーはファイル コピーのように機能するデータベース バックアップです。ファイルが正常にコピーされると、while(not quit) ループが終了します。これを従来の worker-waits-for-condition に関連付けて作業を取得します。私のワーカーは必要なファイルのコピーを待機し、while ループは要求された作業を実行しています。上記の do_work は do_piece_of_work と考えることができます。