Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在循环中运行std::async。如何获得一致的结果?_Multithreading_Qt_C++11_Parallel Processing_Stdasync - Fatal编程技术网

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