1

次のような状況があります。

boost::thread_group インスタンスを作成し、いくつかのデータを並列処理するためのスレッドを作成してから、スレッドで join_all を作成します。

最初に、次のように、データの X 要素ごとにスレッドを作成しました。

// begin = someVector.begin();
// end = someVector.end();
// batchDispatcher = boost::function<void(It, It)>(...);

boost::thread_group     processors;

// create dispatching thread every ASYNCH_PROCESSING_THRESHOLD notifications
while(end - begin > ASYNCH_PROCESSING_THRESHOLD)
{
    NotifItr split = begin + ASYNCH_PROCESSING_THRESHOLD;

    processors.create_thread(boost::bind(batchDispatcher, begin, split));
    begin = split;
}

// create dispatching thread for the remainder
if(begin < end)
{
    processors.create_thread(boost::bind(batchDispatcher, begin, end));
}

// wait for parallel processing to finish
processors.join_all();

しかし、これには問題があります。大量のデータがある場合、このコードは多くのスレッド (> 40 スレッド) を生成し、スレッド切り替えコンテキストでプロセッサをビジー状態に保ちます。

私の質問は次のとおりです。join_allの呼び出しに、thread_group で create_thread を呼び出すことは可能ですか。

つまり、コードをこれに変更できますか?

boost::thread_group     processors;
size_t                  processorThreads = 0; // NEW CODE

// create dispatching thread every ASYNCH_PROCESSING_THRESHOLD notifications
while(end - begin > ASYNCH_PROCESSING_THRESHOLD)
{
    NotifItr split = begin + ASYNCH_PROCESSING_THRESHOLD;

    processors.create_thread(boost::bind(batchDispatcher, begin, split));
    begin = split;

    if(++processorThreads >= MAX_ASYNCH_PROCESSORS) // NEW CODE
    {                               // NEW CODE
        processors.join_all();      // NEW CODE
        processorThreads = 0;       // NEW CODE
    }                               // NEW CODE
}

// ... 

これを経験した人は誰でも、洞察に感謝します。

4

1 に答える 1

1

これは不可能だと思います。実際に必要な解決策は、生産者/消費者またはマスターワーカーを実装することです(メインの「マスター」スレッドは、作業をいくつかの固定サイズのタスクに分割し、「ワーカー」スレッドのプールを作成し、すべてのタスクが完了するまで各ワーカーに1つのタスクを送信します完了)。

これらのソリューションでは、セマフォを介した同期が必要になりますが、マシンで使用可能なコアごとに1つのスレッドを作成できるパフォーマンスと同等になり、コンテキストスイッチでの時間の浪費を回避できます。

もう1つのあまり良くないオプションは、一度に1つのスレッドに参加することです。4つのアクティブなスレッドを持つベクトルを作成し、1つを結合して、別のスレッドを作成できます。このアプローチの問題は、タスクが異種である場合に処理時間を浪費する可能性があることです。

于 2010-02-23T15:49:48.647 に答える