使用线程池的多线程
我目前使用boost线程池的线程数等于核心数。我已经安排了,使用游泳池的日程功能说10个任务。例如, 假设我有功能使用线程池的多线程
void my_fun(std::vector<double>* my_vec){
// Do something here
}
这里只是用来做一些临时的计算参数“my_vec”。我把它传递给函数的主要原因是当我再次调用函数时,我想重用这个向量。
目前,我有以下
// Create a vector of 10 vectors called my_vecs
// Create threadpool
boost::threadpool::pool tp(num_threads);
// Schedule tasks
for (int m = 0; m < 10; m++){
tp.schedule(boost::bind(my_fun, my_vecs.at(m)));
}
这是我的问题:我想只有2载体,以取代10个向量的向量。如果我想安排10个任务,并且我有2个内核,则最多可以有2个线程(任务)在任何时间运行。所以我只想使用两个向量(一个分配给每个线程)并使用它来执行我的10个任务。我怎样才能做到这一点?
我希望这很清楚。谢谢!
很可能boost::thread_specific_ptr
是你需要的。下面是你如何在你的功能中使用它:
#include <boost/thread/tss.hpp>
boost::thread_specific_ptr<std::vector<double> > tls_vec;
void my_fun()
{
std::vector<double>* my_vec = tls_vec.get();
if(!my_vec) {
my_vec = new std::vector<double>();
tls_vec.reset(my_vec);
}
// Do something here with my_vec
}
它将重新使用调度到同一线程的任务之间的向量实例。如果池中有更多的线程,可能会有两个以上的实例,但由于在其他答案中提到的抢占,您确实需要每个正在运行的线程实例,而不是每个核心。
您不应该删除存储在thread_specific_ptr
中的矢量实例;当相应的线程完成时,这些将被自动销毁。
Java有一个FixedThreadPool。
看起来升压可能也有类似的
http://deltavsoft.com/w/RcfUserGuide/1.2/rcf_user_guide/Multithreading.html
基本上是一个固定的线程池产生的线程固定数量的,然后你可以排队的队列管理任务的东西。
虽然只有两个线程可以同时调度,但在许多线程系统中,线程会得到时间片,因此线程在执行任务期间被抢占。因此,第三个(第四,...)线程将有机会工作,而第一个和第二个线程的处理仍然不完整。
我不知道这个特定的线程实现,但我的猜测是它将允许(或运行在支持环境)先发制人调度。我对线程的思考方式是尽量保持简单,让每个线程都拥有自己的资源。
我不会将线程数限制为核心数。请记住,在我们拥有多核处理器之前,多线程编程已经进行得很久。这是因为线程可能会阻塞某些资源,并且下一个线程可以跳入并使用CPU。
软件线程切换很昂贵。通常的方式不仅仅是等待大多数资源被加载(并且由于单核上的性能原因,我们没有多线程,而是多任务处理)。你所描述的是为什么我们有时在单个内核上有多个_hardware_线程。 – Bahbar 2011-05-13 07:10:15
我不同意。有时可能会更昂贵,但我不同意这是典型的。您必须根据应用程序对应用程序进行评估。相信我,单个核心上的多个线程肯定能够提高性能。特别是当一个线程负责UI交互时。例如,Apple包括[NSOperations for iPhone apps](http://www.icodeblog.com/2010/03/04/iphone-coding-turbo-charging-your-apps-with-nsoperation/)。 iPhone是单核心,但苹果认为需要多个线程。 – 2011-05-13 11:50:10
我同意我的说法是过度清理(你的UI例子是一个很好的例子)。但对于仅计算?这就是我的问题。 – Bahbar 2011-05-13 12:07:32
也许http://stackoverflow.com/questions/3344028/how-to-make-boostthread-group-execute-a-fixed-number-of-parallel-threads会有帮助吗? – sarnold 2011-05-13 05:36:12