次のような状況があります。
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
}
// ...
これを経験した人は誰でも、洞察に感謝します。