Усилитель потока Thread_group

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

    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 с очередью задач.

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

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

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

Посмотрите этот ответ для двух разных демонстраций такого пула потоков с очередью задач: Вычисление суммы большого вектора параллельно

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]