Boost thread_group线程限制器
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();
}
您可能正在寻找的是 thread_pool 任务队列。
有固定数量的线程阻塞队列。每当任务被推入队列时,工作线程就会收到信号(条件变量)并处理任务。
那样你
- 没有(低效的)等待锁
- 线程数不超过 "maximum"
- 不必阻塞在推送任务的代码中
- 不要每次都创建多余的线程
有关带有任务队列的线程池的两个不同演示,请参阅此答案:
我正在尝试随时将线程数限制为最大可用内核数。以下是合理的方法吗?有更好的选择吗?谢谢!
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();
}
您可能正在寻找的是 thread_pool 任务队列。
有固定数量的线程阻塞队列。每当任务被推入队列时,工作线程就会收到信号(条件变量)并处理任务。
那样你
- 没有(低效的)等待锁
- 线程数不超过 "maximum"
- 不必阻塞在推送任务的代码中
- 不要每次都创建多余的线程
有关带有任务队列的线程池的两个不同演示,请参阅此答案: