gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:20:24 27 4
gpt4 key购买 nike

所以我有类似的东西

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 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() 非常重要,可确保线程不会在后台恶意运行。

显然,如果您有很多函数要调用并且不希望创建那么多线程,则您必须跟踪未完成线程的数量并且仅在现有线程退出后才创建新线程。这将需要在调用的函数内部进行一些额外的簿记(并且可能涉及包装函数)。您的情况可能不需要。

关于c++ - 如何在新的单独线程中从 vector 运行每个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4870151/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com