I have a problem returning std::vector using std::future and std::async. Why does
#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;
}
compilled with g++ -std=c++11 -pthread work as expected printing
0 1 2 3 4 5 6 7 8 9
but
#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;
}
compiled in the same way throw
terminate called after throwing an instance of 'std::future_error'
what(): No associated state
Is there something wrong with the way I am returning the vector in the lambda function with std::async?
You are calling get() multiple times on the elements of sumarray. According to the documentation:
valid() is false after a call to this method.
This means that you can't call get() more than once as your inner loop does.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With