4

boost::thread クラスには、「非スレッド」を与えるデフォルトのコンストラクターがあります。

boost::thread t1;

良い?コードの後半で実行する関数を指定できますか?

そして別の質問:

段階的なアーキテクチャ (SEDA) を持つ小さなサーバーを作成しようとしています。各段階には多数のワーカー スレッドがあり、段階はイベント キューに接続されています。次のようにboost::thread_groupを使用して4つのワーカースレッドでプールを作成すると:(ここでクリーンアップするためにキューの条件変数を削除しました。また、キューのサイズが常に4Nであると仮定しています。)

boost::thread_group threads;
while(!event_queue.empty())
{
    for(int i = 0; i < 4; ++i)
    {
        threads.create_thread(event_queue.front());
        event_queue.pop();
    }

    threads.join_all();
}

thread_group はサイズが大きくなり続けます。終了したグループ内のスレッドはどうなりますか?また、これらのスレッドを再利用して、thread_group のサイズを 4 に保つにはどうすればよいですか?

私はこの質問を見て、上記のコードの代わりにこれを使用しました:

std::vector<boost::shared_ptr<boost::thread>> threads;
while(!event_queue.empty())
{
    for(int i = 0; i < 4; ++i)
    {
        boost::shared_ptr<boost::thread> 
            thread(new boost::thread(event_queue.front());
        event_queue.pop();
        threads.push_back(thread);
    }

    for(int i = 0; i < 4; ++i)
        threads[i]->join();

    threads.clear();
}

違いは何ですか?どちらがより良いパフォーマンスを持っていますか?メモリリークは発生しますか?または、スレッドの単純なプールを作成する別の方法はありますか?

助けていただければ幸いです。どうもありがとうございました。

4

1 に答える 1

3

1 つのオプションは、boost asio を使用することです。スレッド プールのレシピをご覧ください: http://think-async.com/Asio/Recipes。次に、io_service の post メソッドを使用して、イベントをスレッド プールにポストします。

于 2010-11-25T18:35:25.947 に答える