2016-02-11 4 views
0

Я пытаюсь ограничить количество потоков в любое время, чтобы быть максимально равным количеству доступных ядер. Является ли следующий разумный метод? Есть ли лучшая альтернатива? Благодаря!Boost thread_group thread limiter

boost::thread_group threads; 
    iThreads = 0; 

    for (int i = 0; i < Utility::nIterations; i++) 
    { 

     threads.create_thread(
      boost::bind(&ScenarioInventory::BuildInventoryWorker, this,i)); 

     thread_limiter.lock(); 
     iThreads++; 
     thread_limiter.unlock(); 

     while (iThreads > nCores) 
      std::this_thread::sleep_for(std::chrono::milliseconds(1)); 

    } 

threads.join_all(); 


void ScenarioInventory::BuildInventoryWorker(int i) 
{ 
    //code code code.... 

    thread_limiter.lock(); 
    iThreads--; 
    thread_limiter.unlock(); 
} 

ответ

0

Что вы, скорее всего, ищете, это thread_pool с очередью задач.

Имейте фиксированное количество потоков, блокирующих очередь. Всякий раз, когда задача помещается в очередь, рабочий поток получает сигнал (переменная условия) и обрабатывает задачу.

Таким образом, вы

  • не имеют (неэффективное) ожидания блокировки
  • не имеет каких-либо больше потоков, чем «максимум»
  • не должны блокировать в коде что толкает задачу
  • не имеет избыточное создание нитей каждый раз, когда вокруг

Смотрите этот ответ для двух различных демок такого Автошоу ad pool w/task queue: Calculating the sum of a large vector in parallel

Смежные вопросы