gpt4 book ai didi

C++多线程返回值

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

我正在使用 3 个线程来分块一个 for 循环,并且“数据”是一个全局数组,所以我想将该部分锁定在“calculateAll”函数中,

 std::vector< int > calculateAll(int ***data,std::vector<LineIndex> indexList)
{
std::vector<int> v_a=std::vector<int>();
for(int a=0;a<indexList.size();a++)
{
mylock.lock();
v_b.push_back(/*something related with data*/);
mylock.unlock();
v_a.push_back(a);
}
return v_a;
}
for(int i=0;i<3;i++)
{
int s =firstone+i*chunk;
int e = ((s+chunk)<indexList.size())? (s+chunk) : indexList.size();
t[i]=std::thread(calculateAll,data,indexList,s,e);
}
for (int i = 0; i < 3; ++i)
{
t[i].join();
}

我的问题是,如何从每个线程中获取作为 vector 的返回值,然后将它们组合在一起?我想这样做的原因是因为如果我将 'v_a' 声明为全局 vector ,当每个线程试图将它们的值 push_back 到这个 vector 'v_a' 中时,它会崩溃(或不会?)。所以我想为每个线程声明一个 vector ,然后将它们组合成一个新的 vector 以供进一步使用(就像我在没有线程的情况下所做的那样)。

或者是否有更好的方法来处理并发问题? “v_a”的顺序无关紧要。

我很感激任何建议。

最佳答案

首先,不要在代码中看到显式的 lock()unlock(),而是始终使用 std::lock_guard在可能的情况。其次,你最好使用 std::futures对这件事。使用 std::async 启动每个线程然后在另一个循环中获取结果,同时聚合结果。像这样:

using Vector = std::vector<int>;
using Future = std::future<Vector>;
std::vector<Future> futures;

for(int i=0;i<3;i++)
{
int s =firstone+i*chunk;
int e = ((s+chunk)<indexList.size())? (s+chunk) : indexList.size();
auto fut = std::async(std::launch::async, calculateAll, data, indexList, s, e);
futures.push_back( std::move(fut) );
}

//Combine the results
std::vector<int> result;
for(auto& fut : futures){ //Iterate through in the order the future was created
auto vec = fut.get(); //Get the result of the future
result.insert(result.end(), vec.begin(), vec.end()); //append it to results in order
}

这是一个基于您的代码的最小、完整且有效的示例 - 它演示了我的意思:Live On Coliru

关于C++多线程返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41387335/

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