如何在新的单独线程中从vector运行每个函数?

时间:2011-02-02 02:15:58

标签: c++ multithreading boost boost-thread

所以我有类似

的东西
typedef boost::function<void(DataType)>   Function;
typedef std::vector<Function>      FunctionSequence;
typedef typename FunctionSequence::iterator FunctionIterator; 


DataType* dataElement;
FunctionSequence funcs; 
    //...
    for (FunctionIterator it(funcs.begin()); it != funcs.end(); ++it){
        DataType dataCopy;
        dataCopy = *dataElement;
        (*it)(dataCopy);

如何使用boost.thread使每个向量函数在单独的新线程中运行,或者如果它更好地有一个线程向量,那么每次都不创建rad?

1 个答案:

答案 0 :(得分:4)

如果你要做的是为每个函数启动一个新线程,并传入一个DataType对象的副本,你将需要使用Boost ThreadsBoost Bind

#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <boost/thread.hpp>

boost::thread_group tg;

for (FunctionIterator it(funcs.begin()); it != funcs.end(); ++it)
{
    tg.create_thread(boost::bind(*it, *dataElement));
}

tg.join_all();

首先,创建一个boost::thread_group,它将作为您启动的所有线程的容器。然后create_thread将启动一个新线程并调用传递给它的函数。在这种情况下,我们想要调用的不仅仅是一个简单的函数,因此我们需要使用boost::bind来创建一个线程可以运行的void()函数。对boost::bind的调用首先指定要调用的函数,然后指定要传递给函数的任何参数。它已经复制了参数,所以不需要事先创建另一个副本。

启动所有线程后,可以调用tg.join_all()等待所有线程完成后再继续。调用join_all()非常重要,并确保线程不会在后台运行流氓。

显然,如果要调用很多函数并且不希望创建多个线程,则必须跟踪未完成线程的数量,并且只有在现有线程退出时才创建新线程。这将需要在被调用的函数内部保留一些额外的簿记(并且可能涉及包装函数)。在你的情况下可能不需要它。