4

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

4

2 回答 2

10

您可能需要添加以下启动策略std::launch::async

std::async(std::launch::async, foo);
于 2012-11-17T16:32:37.023 回答
0

std::future 在这个CppCon 演示文稿中被批评为速度慢。您可以通过使用此仅标头库完全避免 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) = @
    */
于 2020-10-28T12:49:26.807 回答