使用线程池进行多线程处理

时间:2011-05-13 05:22:01

标签: c++ multithreading threadpool

我目前正在使用boost threadpool,其线程数等于内核数。我已安排,使用池的日程安排功能说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个任务。我怎么能这样做?

我希望这很清楚。谢谢!

4 个答案:

答案 0 :(得分: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中存储的矢量实例;当相应的线程完成时,这些将被自动销毁。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

Java有一个FixedThreadPool。

看起来Boost可能有类似的东西

http://deltavsoft.com/w/RcfUserGuide/1.2/rcf_user_guide/Multithreading.html

基本上,固定的线程池产生了固定数量的线程,然后您可以在管理器队列中对任务进行排队。

答案 3 :(得分:0)

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

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