所以我有类似
的东西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?
答案 0 :(得分:4)
如果你要做的是为每个函数启动一个新线程,并传入一个DataType对象的副本,你将需要使用Boost Threads和Boost 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()
非常重要,并确保线程不会在后台运行流氓。
显然,如果要调用很多函数并且不希望创建多个线程,则必须跟踪未完成线程的数量,并且只有在现有线程退出时才创建新线程。这将需要在被调用的函数内部保留一些额外的簿记(并且可能涉及包装函数)。在你的情况下可能不需要它。