2011-05-13 178 views
2

我目前使用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个任务。我怎样才能做到这一点?

我希望这很清楚。谢谢!

+0

也许http://stackoverflow.com/questions/3344028/how-to-make-boostthread-group-execute-a-fixed-number-of-parallel-threads会有帮助吗? – sarnold 2011-05-13 05:36:12

回答

1

很可能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中的矢量实例;当相应的线程完成时,这些将被自动销毁。

0

虽然只有两个线程可以同时调度,但在许多线程系统中,线程会得到时间片,因此线程在执行任务期间被抢占。因此,第三个(第四,...)线程将有机会工作,而第一个和第二个线程的处理仍然不完整。

我不知道这个特定的线程实现,但我的猜测是它将允许(或运行在支持环境)先发制人调度。我对线程的思考方式是尽量保持简单,让每个线程都拥有自己的资源。

1

我不会将线程数限制为核心数。请记住,在我们拥有多核处理器之前,多线程编程已经进行得很久。这是因为线程可能会阻塞某些资源,并且下一个线程可以跳入并使用CPU。

+0

软件线程切换很昂贵。通常的方式不仅仅是等待大多数资源被加载(并且由于单核上的性能原因,我们没有多线程,而是多任务处理)。你所描述的是为什么我们有时在单个内核上有多个_hardware_线程。 – Bahbar 2011-05-13 07:10:15

+0

我不同意。有时可能会更昂贵,但我不同意这是典型的。您必须根据应用程序对应用程序进行评估。相信我,单个核心上的多个线程肯定能够提高性能。特别是当一个线程负责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

+1

我同意我的说法是过度清理(你的UI例子是一个很好的例子)。但对于仅计算?这就是我的问题。 – Bahbar 2011-05-13 12:07:32