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

时间:2013-11-05 02:19:21

标签: c++ c++11 vector

我使用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;

}

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

}

以相同的方式编译抛出

terminate called after throwing an instance of 'std::future_error'
  what():  No associated state

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

2 个答案:

答案 0 :(得分:4)

您在get()的元素上多次调用sumarray。根据{{​​3}}:

  调用此方法后,

valid()为false。

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

答案 1 :(得分:1)

以下代码有效。评论出界线就是问题所在。正如JaredC所说,问题是在内循环中使用get()。同样,从内存中为每个元素获取整个向量的效率非常低下,但这对我而言只是一种不好的做法。 y_futures是未来双打向量的向量。

 for (size_t i = 0; i < parts; ++i) {
    std::vector<double> temp = y_futures[i].get();
    for (size_t j = 0; j < num_rows_; ++j) {
      // y(j) = y_futures[i].get()[j];
      y(j) += temp[j];
    }
  }    ````