在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个,但我要问的解决方案会更透明,更方便。
答案 0 :(得分:3)
您真正想要的只是拥有4个线程,每个线程都会处理许多作业。
实现这一点的一种方法是根据需要生成尽可能多的线程,然后为每个线程的运行循环从一个线程安全的队列结构中获取任务(通常是函数对象或指针),您可以在其中存储所有内容这需要做。
这样可以避免创建大量线程的开销,并且仍然保持相同的并发量。
答案 1 :(得分:3)
不要认为Boost.Thread内置了这个,但你可以将Boost.Threadpool(不是官方库)覆盖到Boost.Thread,这确实允许你通过SizePolicy
控制线程数
默认值为fixed-size pool,这是您想要的 - 指定threadpool
构造函数的初始(和正在进行的)线程数。
答案 2 :(得分:1)
你可以创建一个你只能获得n次的锁。然后每个线程都必须在处理之前获得锁定(阻塞)。