在此代码段中使用C ++ 11 std :: async:
int foo()
{
::sleep(2);
return 123;
}
int main()
{
future<int> r1(async(foo));
int r2 = foo();
cout << r1.get() + r2 << endl;
return 0;
}
它产生正确的结果,但是连续运行两个foo(整个应用程序运行4秒)。编译为:
g++ -std=gnu++11 -O2 foo.cc -lpthread
(Ubuntu 12.10 64bit,gcc 4.7.2)
答案 0 :(得分:10)
您可能需要添加std::launch::async
std::async(std::launch::async, foo);
:
{{1}}
答案 1 :(得分:0)
std :: future已受到批评,例如this CppCon演示文稿中的运行缓慢。您可以使用this header-only library完全避免std :: async和std:future。您可以异步运行任意数量的函数,并以元组的形式获取结果。另外,可以正常捕获异常。
这里是一个例子:
#include <iostream>
#include "Lazy.h"
template <class T>
T foo(T x) {
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
return x + 10.5;
}
int main() {
int input = 54;
try {
auto [i, d, c] = Lazy::runParallel(
[&](){ return foo(int(input)); },
[&](){ return foo(double(input)); },
[&](){ return foo(char(input)); } );
std::cout << "foo(int) = " << i << ", foo(double) = " << d << ", foo(char) = " << c << '\n';
}
catch (...) {
// Deal with the exception here
}
}
/* Output:
foo(int) = 64, foo(double) = 64.5, foo(char) = @
*/