C 多线程返回值
c++ multithreading return value
我正在使用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
创建带有向量和锁的结构。将该结构的实例(并预先锁定锁)传递给每个线程的启动。等待所有锁被解锁。然后,每个线程完成工作并在完成后解锁锁。
相关文章:
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 将数组作为多线程应用程序中函数的返回传递
- 在多线程函数中返回共享的常量指针会导致计时问题吗?
- C 多线程返回值
- 如何在不使用 C++/C 中的阻塞函数的情况下将值从线程返回到主函数
- 提升多线程向量的返回值
- 多线程应用程序中的非原子赋值
- 使用多线程用值填充数组
- C++引用从多线程返回值
- 使用蒙特卡罗方法多线程计算pi值