gpt4 book ai didi

c++ - 使用线程池的多线程

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:36 25 4
gpt4 key购买 nike

我目前正在使用线程数等于内核数的 boost 线程池。我已经使用池的计划功能安排了 10 个任务。例如,假设我有这个功能

void my_fun(std::vector<double>* my_vec){
// Do something here
}

这里的参数'my_vec'只是用来做一些临时计算的。我将函数传递给它的主要原因是我想在再次调用函数时重用这个 vector 。

目前,我有以下内容

// Create a vector of 10 vectors called my_vecs

// Create threadpool
boost::threadpool::pool tp(num_threads);

// Schedule tasks
for (int m = 0; m < 10; m++){
tp.schedule(boost::bind(my_fun, my_vecs.at(m)));
}

这是我的问题:我想用 2 个 vector 替换 10 个 vector 的 vector 。如果我要调度10个任务,我有2个核心,那么任何时候最多有2个线程(任务)在运行。所以我只想使用两个 vector (一个分配给每个线程)并用它来执行我的 10 个任务。我该怎么做?

我希望这是清楚的。谢谢!

最佳答案

可能 boost::thread_specific_ptr是你需要的。以下是您可以如何在您的函数中使用它:

#include <boost/thread/tss.hpp>
boost::thread_specific_ptr<std::vector<double> > tls_vec;

void my_fun()
{
std::vector<double>* my_vec = tls_vec.get();
if( !my_vec ) {
my_vec = new std::vector<double>();
tls_vec.reset(my_vec);
}
// Do something here with my_vec
}

它将在调度到同一线程的任务之间重用 vector 实例。如果池中有更多线程,可能会有 2 个以上的实例,但由于其他答案中提到的抢占,您确实需要每个运行线程而不是每个内核一个实例。

您不需要删除存储在thread_specific_ptr 中的 vector 实例;这些将在相应线程完成时自动销毁。

关于c++ - 使用线程池的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5987535/

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