6

我编写了以下代码来测试在 Ubuntu 上使用 GCC 4.8.2std::async()返回的函数。void

#include <future>
#include <iostream>

void functionTBC()
{
    std::cerr << "Print here\n";
}

int main(void)
{
#ifdef USE_ASYNC
    auto i = std::async(std::launch::async, functionTBC);
#else
    auto i = std::async(std::launch::deferred, functionTBC);
#endif
    //i.get();
    return 0;
}

如果i.get();未注释,则消息"Print here"始终存在;然而,如果i.get();被注释掉,"Print here"当且仅当USE_ASYNC被定义时才存在(也就是说,std::launch::async总是导致消息打印出来,而std::launch::deferred从不)。

这是有保证的行为吗?确保异步调用返回void执行的正确方法是什么?

4

1 回答 1

9

std::launch::deferred.wait()意思是“在我或之前不要运行它.get()”。

正如您从未.get().wait()编辑过的那样,它从未运行过。

void与此无关。

对于std::launch::async,标准规定返回的未来的析构函数 ( ~future) 将阻塞直到任务完成(即,有一个隐含的.wait())。MSVC 故意违反了这一点,因为他们不同意该设计决定,并且他们正在努力更改标准:实际上,这意味着如果您想对代码进行未来验证,您根本不能依赖std::launch::async返回的任何行为future.

如果没有隐式waitin ,它是否在退出~future时实际调用该函数将是不确定的。main它要么已经发生,要么没有。可能您可以通过在main.

您可能想知道deferred有什么用处:您可以使用它来排队计算以进行延迟评估。

于 2015-05-29T16:57:14.480 回答