c++ - 是否保证为返回 void 的函数调用 std::async?

标签 c++ c++11 asynchronous stdasync

我编写了以下代码来测试 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/

相关文章:

c++ - 错误 : No matching constructor for initialization of 'Matrix_ref<...>'

c++ - "import"从基类定义一个函数来实现抽象接口(interface)(C++中的多重继承)

c++ - 我对为 std::array 赋值的方式有一些疑问

c++ - 使用 boost::future .then() 时出现编译错误

javascript - 如何从异步调用返回响应?

c++ - OpenGL:三角形带中的退化三角形在 OpenGL-ES 之外是否可以接受?

c++ - 如何在 Rust 中将绑定(bind)传递给 sqlite3?

java - 如何按输入顺序输出C++11 unordered_map/unordered_set和Java HashMap/HashSet值?

c# - 自定义TaskFactory不使用自定义SynchronizationContext

java - 在 Asynctask 中显示 Progresscircle