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

标签 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 使每个 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/

相关文章:

c++ - 使用类构造函数初始化类对象的指针?

c++ - FLTK - 编译多个 .cpp - Linux

c++ - 为什么我的 vector 迭代器不兼容?

c++ - 预处理器宏串联以构建类函数

c++ - boost fast_pool_allocator 有时会请求大量分配

c++ - 这是什么编程技术? ( boost 图书馆)

c++ - boost::geometry::union 没有结果

python - 同时运行多个线程

multithreading - 原子操作会阻塞其他线程吗?

java - 如果直接从内存读取 volatile 字段,那么从哪里读取非 volatile 字段?