使用 std::async c++11 返回 std:vector

Rob*_*iam 3 c++ vector c++11

我在使用 std::future 和 std::async 返回 std::vector 时遇到问题。为什么

#include <iostream>
#include <vector>
#include <functional>
#include <future>

using namespace std;

int main(int argc, char** argv) {

  int A = 10;
  vector<future<int>> sumarray(A);

  for(int i = 0; i < A; i++) 
    sumarray[i] = async( launch::async, [i] { return i; } );

  for(int i = 0; i < A; i++) 
    cout << sumarray[i].get() << " "; 
  cout << endl;

}
Run Code Online (Sandbox Code Playgroud)

用 g++ -std=c++11 -pthread 编译,按预期打印

0 1 2 3 4 5 6 7 8 9

#include <iostream>
#include <vector>
#include <functional>
#include <future>

using namespace std;

int main(int argc, char** argv) {

  int A = 10;
  int B = 2;
  vector<future<vector<int>>> sumarray(A);

  for(int i = 0; i < A; i++){
    sumarray[i] = async( launch::async, [i,B] { 
        vector<int> v(B);
        for(int j = 0; j < B; j++) v[j] = (j+1)*i;
        return v;
      }); 
  }

  for(int j = 0; j < B; j++)
    for(int i = 0; i < A; i++) 
      cout << sumarray[i].get()[j] << " "; 
  cout << endl;

}
Run Code Online (Sandbox Code Playgroud)

以同样的方式编译 throw

terminate called after throwing an instance of 'std::future_error'
  what():  No associated state
Run Code Online (Sandbox Code Playgroud)

我使用 std::async 在 lambda 函数中返回向量的方式有问题吗?

Jar*_*edC 5

get()在 的元素上多次调用sumarray。根据文档

调用此方法后,valid() 为 false。

这意味着您不能get()像内部循环那样多次调用。