boost :: thread:如何启动所有线程,但一次最多只运行n个?

时间:2010-12-04 18:29:57

标签: c++ multithreading boost

boost::thread库中,是否有任何机制可以控制一次运行多少个线程(最多)?

在我的情况下,最方便的是同时启动N个线程(N可能是几百或几千):

std::vector<boost::thread*> vec;
for (int i = 0; i < N; ++i) {
   vec.push_back(new boost::thread(my_fct));
}
// all are running, now wait for them to finish:
for (int i = 0; i < N; ++i) {
  vec[i]->join();
  delete vec[i];
}

但我希望Boost透明地设置最多4个线程,例如,一次运行4个线程。 (我正在共享一台8核机器,所以我不应该一次运行超过4台。)

当然,我自己可以一次只启动4个,但我要问的解决方案会更透明,更方便。

3 个答案:

答案 0 :(得分:3)

您真正想要的只是拥有4个线程,每个线程都会处理许多作业

实现这一点的一种方法是根据需要生成尽可能多的线程,然后为每个线程的运行循环从一个线程安全的队列结构中获取任务(通常是函数对象或指针),您可以在其中存储所有内容这需要做。

这样可以避免创建大量线程的开销,并且仍然保持相同的并发量。

答案 1 :(得分:3)

不要认为Boost.Thread内置了这个,但你可以将Boost.Threadpool(不是官方库)覆盖到Boost.Thread,这确实允许你通过SizePolicy控制线程数

默认值为fixed-size pool,这是您想要的 - 指定threadpool构造函数的初始(和正在进行的)线程数。

答案 2 :(得分:1)

你可以创建一个你只能获得n次的锁。然后每个线程都必须在处理之前获得锁定(阻塞)。