所以我有类似的东西
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 使每个 vector 函数在单独的新线程中运行,或者最好有一个线程 vector ,以免每次都创建 therad?
最佳答案
如果您想要为每个函数启动一个新线程,并传入 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()
非常重要,它可以确保线程不会在后台非法运行。
显然,如果您有很多函数要调用并且不希望创建那么多线程,则必须跟踪未完成线程的数量,并且只有在现有线程退出后才创建新线程。这将需要在被调用的函数内进行一些额外的记录(并且可能涉及包装该函数)。您的情况可能不需要它。
关于c++ - 如何在新的单独线程中运行 vector 中的每个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4870151/