C 多线程返回值

c++ multithreading return value

本文关键字:返回值 多线程      更新时间:2023-10-16

我正在使用3个线程来循环块,而'data'是一个全局数组

 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();
    }

我的问题是,如何从每个线程中获取返回值,然后将它们组合在一起?我要这样做的原因是因为如果我将" v_a"声明为全局向量,当每个线程在此向量" v_a"中努力pusth_back的值时,这将是一些崩溃(或者不是吗?)。所以我正在考虑要去为每个线程声明一个向量,然后将它们集合到新的向量中以供进一步使用(就像我这样做一样,没有线程)。

还是有一些更好的方法来解决该并发问题?'v_a'的顺序无关紧要。

我感谢任何建议。

首先,而不是明确 lock() unlock()在您的代码中看到的,请始终在可能的情况下使用std::lock_guard。其次,最好将std::future S用于此东西。使用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

创建带有向量和锁的结构。将该结构的实例(并预先锁定锁)传递给每个线程的启动。等待所有锁被解锁。然后,每个线程完成工作并在完成后解锁锁。