0

我试图随时将线程数限制为等于最大可用内核数。以下是合理的方法吗?有更好的选择吗?谢谢!

    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();
}
4

1 回答 1

0

您可能正在寻找的是带有任务队列的 thread_pool。

有固定数量的线程阻塞队列。每当将任务推入队列时,工作线程就会收到信号(条件变量)并处理该任务。

这样你

  • 没有(低效的)等待锁
  • 没有比“最大”更多的线程
  • 不必阻塞推送任务的代码
  • 不要每次都重复创建线程

有关这种带任务队列的线程池的两个不同演示,请参阅此答案:并行计算大向量的总和

于 2016-02-13T13:23:13.913 回答