我编写了以下代码来测试 std::async()
在 Ubuntu 上使用 GCC 4.8.2 返回 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();
被注释掉,当且仅当 USE_ASYNC
被定义(即, std::launch::async
总是导致打印出消息,而 std::launch::deferred
从不)。
这是有保证的行为吗?确保执行返回 void
的异步调用的正确方法是什么?
最佳答案
std::launch::deferred
表示“在我 .wait()
或 .get()
之前不要运行它”。
因为您从未执行过 .get()
或 .wait()
,所以它从未运行过。
void
与此无关。
对于 std::launch::async
,标准声明返回的 future 的析构函数(~future
)将阻塞直到任务完成(即,有一个隐式 .wait()
)。 MSVC 故意违反了这一点,因为他们不同意该设计决策,并且他们正在努力改变标准:实际上,这意味着您根本不能依赖 std::launch::async 的任何行为
如果您希望您的代码面向 future ,则返回 future
。
如果 ~future
中没有隐式的 wait
,当 main
退出时它是否真的调用了函数将是不确定的。它要么发生,要么不发生。可能您可以通过在 main
的末尾设置仍处于事件状态的线程来调用 UB。
您可能想知道 deferred
有什么用处:您可以使用它来为惰性计算排队计算。
关于c++ - 是否保证为返回 void 的函数调用 std::async?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30535028/