Multithreading 在循环中运行std::async。如何获得一致的结果?
我尝试将计算并行化,并将结果写入向量 我使用的是Multithreading 在循环中运行std::async。如何获得一致的结果?,multithreading,qt,c++11,parallel-processing,stdasync,Multithreading,Qt,C++11,Parallel Processing,Stdasync,我尝试将计算并行化,并将结果写入向量 我使用的是std::async。程序在短暂的停顿下运行良好(参见注释行)。如果没有此暂停,程序将崩溃 类异步调度程序{ 公众: /*Data是一个自定义类,其数据包含ID。 *该对象不包含任何内容 *链接或指针*/ 向量计算结果(向量参数){ 矢量结果; 矢量期货; threadID=0; 用于(自动参数:参数){ futures.push_back(((std::async(std::launch::async,[&])){ 此_线程::sleep_fo
std::async
。程序在短暂的停顿下运行良好(参见注释行)。如果没有此暂停,程序将崩溃
类异步调度程序{
公众:
/*Data是一个自定义类,其数据包含ID。
*该对象不包含任何内容
*链接或指针*/
向量计算结果(向量参数){
矢量结果;
矢量期货;
threadID=0;
用于(自动参数:参数){
futures.push_back(((std::async(std::launch::async,[&])){
此_线程::sleep_for(chrono::毫秒(100));//如果没有此命令,则不可用
//^^^^^^^^^^^^^^^^^^^^^^^^^
返回numberdData(filler.createData(param,threadID),threadID);
}))));
threadID++;
}
适用于(汽车和燃油:期货){
结果。推回(f.get().data);
}
返回结果;
}
AsyncDispatcher():线程ID(0){}
私人:
int-threadID;
Filler Filler;//用数字填充数据
};
除此之外,您的lambda还有一个默认的引用捕获,这意味着使用的
param
和threadID
的值不一定是预期值。您确实需要提供一个。您的lambda通过引用捕获一个局部变量param
。当lambda实际运行时,该变量可能已经被销毁。lambda尝试使用现在悬空的引用会显示未定义的行为。除此之外,lambda还有一个默认的引用捕获,这意味着使用的param
和threadID
的值不一定是预期值。您确实需要提供一个。您的lambda通过引用捕获一个局部变量param
。当lambda实际运行时,该变量可能已经被销毁。lambda尝试使用现在悬空的引用,然后显示出未定义的行为。
class AsyncDispatcher {
public:
/* Data is a custom class with data that contains a ID.
* The object contains no
* links or pointers.*/
vector<Data> calcResult(vector<Params> params) {
vector<Data> result;
vector<std::future<NumberedData>> futures;
threadID = 0;
for (auto param : params) {
futures.push_back(((std::async(std::launch::async, [&]() {
this_thread::sleep_for(chrono::milliseconds(100)); // not workable without this command
//^^^^^^^^^^^^^^^^^^^^^^^^^
return NumberedData(filler.createData(param, threadID), threadID);
}))));
threadID++;
}
for (auto& f : futures) {
result.push_back(f.get().data);
}
return result;
}
AsyncDispatcher() : threadID(0) {}
private:
int threadID;
Filler filler;//fills an Data with numbers
};