gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:32 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com