githubには、ベクターの要素ごとに 1 回非同期で関数を呼び出すために使用できるヘッダーのみのライブラリがあります。関数が値を返す場合、別のベクトルで結果を返します。たとえばこのCppCon プレゼンテーションで遅いと批判されている std::future の使用を回避します。また、例外は正常にキャッチできます。
次に例を示します。
#include <iostream>
#include "Lazy.h"
template <class T1, class T2>
double foo(T1 t1, T2 t2) {
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
return double(t1) + double(t2);
}
int main() {
constexpr int maxThreads = 16; // 0 means as many threads as there are cores
// Make an input vector
std::vector<std::pair<int, float>> vecIn;
for(int i=0; i < 5; ++i)
vecIn.push_back({10 * i, 1.1 * (i+1)});
try {
auto vecOut = Lazy::runForAll<maxThreads>(vecIn,
[](auto in){ return foo(in.first, in.second); });
for (auto i = 0; i < vecOut.size(); ++i)
std::cout << "foo(" << vecIn[i].first
<< ", " << vecIn[i].second
<< ") = " << vecOut[i] << '\n';
} catch (...)
{ // Deal with the exception here
}
}
/* Output:
foo(0, 1.1) = 1.1
foo(10, 2.2) = 12.2
foo(20, 3.3) = 23.3
foo(30, 4.4) = 34.4
foo(40, 5.5) = 45.5
*/