У меня следующая ситуация:
Я создаю экземпляр 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 потоков), который сохраняетпроцессор занят контекстами переключения потоков.
У меня такой вопрос: можно ли вызвать create_thread в группе потоков после вызова join_all.
То естьМогу ли я изменить свой код на это?
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
}
// ...
Кто имеет опыт работы с этим, спасибо за понимание.