std :: async不会并行化任务

时间:2012-11-17 16:23:42

标签: c++ gcc c++11

在此代码段中使用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)

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) = @
    */