我目前正在使用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个任务。我怎么能这样做?
我希望这很清楚。谢谢!
答案 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。