1

C++ 11 スレッド ライブラリを使用して、C++ でマルチスレッド プログラムを作成しています。

次の要件があります。

  1. メインスレッドはある種のイベントをリッスンし、新しいイベントごとに新しいスレッドを起動します
  2. プログラムの終了が要求されると、新しいスレッドの作成がブロックされ、古いスレッドが終了するのを待ちます

リストなどのコンテナにスレッドを保存するオプションがあります。終了する前に、コンテナー内のすべてのスレッドがjoin()-ed になります。ただし、STL コンテナーはスレッドセーフではないため、新しいスレッドを追加し、コンテナーから終了したスレッドを削除する場合は、追加の同期が必要です。この場合、メイン スレッドと子スレッド間の対話はもう少し複雑になります。子スレッドはコンテナーから自身を削除する必要がありますか? そうでない場合、いつ削除するかをメインスレッドにどのように通知しますか? 等

私が見る別の方法は、子スレッドが作成されたときにメインスレッドによってインクリメントされ、その終了の直前に子スレッドによってデクリメントされるアトミック int を持つことです (スレッドはdetach()作成後に -ed されるため、する必要はありませんstd::thread オブジェクトを管理します)。終了する前に、単純なループでアトミック整数が 0 になるのを待ちます。可動部分が少なく、ロックがないため (少なくともターゲット プラットフォームに のロックフリー実装がある限り)、このソリューションの方が適切に見えますstd::atomic<int>

それで、私の質問は、上記の方法のどれが好きですか?

4

1 に答える 1

1

条件待機と組み合わせて、スレッドカウンターを使用するのが私の選択です。終了する最後のスレッドは、条件変数に通知して、ウェイターをウェイクアップする必要があります。

// the waiter
{
    std::lock_guard<std::mutex> g(threads_lock);
    while (threads > 0) {
        threads_cond.wait(threads_lock);
    }
}
//...

// the threads that are exiting
if (--threads == 0) {
    std::lock_guard<std::mutex> g(threads_lock);
    threads_cond.notify_one();
}

もちろん、これthreadsはであると仮定しています。std::atomic

于 2012-07-02T19:37:33.553 に答える