C ++ 11で「恥ずかしい」並列タスクを実行する方法を学ぼうとしています。私が遭遇する一般的なパターンは、値の範囲で評価されたときに関数の結果を取得することです。Python のmultiprocessing.Pool.map
. 私が知っている方法、つまり単一のプロセスを呼び出して結果を待つ方法を示す最小限の例を書きました。この呼び出しを非同期に「マップ」し、すべての値が完了するまで待つにはどうすればよいですか? 理想的には、元と同じ長さと順序のベクトルの結果が欲しいです。
#include <iostream>
#include <thread>
#include <future>
#include <vector>
using namespace std;
double square_add(double x, double y) { return x*x+y; }
int main() {
vector<double> A = {1,2,3,4,5};
// Single evaluation
auto single_result = std::async(square_add,A[2],3);
cout << "Evaluating a single index " << single_result.get() << endl;
// Blocking map
for(auto &x:A) {
auto blocking_result = std::async(square_add,x,3);
cout << "Evaluating a single index " << blocking_result.get() << endl;
}
// Non-blocking map?
return 0;
}
注: このコードをコンパイルするには、フラグgcc
が必要です。-pthreads