我是否必须调用 get 或等待 std::async 未来

do I have to call get or wait on a std::async future

如果我 运行 它与 launch::async 然后我知道它会 运行 无论如何(我想这就是我读到的),但我是否必须按顺序调用 get / wait执行某种清理工作。

我不需要结果,我只是想要一个漂亮的火然后算了。

请注意,返回的未来对象的析构函数将执行阻塞等待,直到您的任务操作完成(并且相应的共享状态将变为就绪)。

查看页面最后一段:https://en.cppreference.com/w/cpp/thread/future/~future

如果您想确保任务完成,您应该调用 get 或 wait。如果你不调用 get 或 wait ,系统将在父线程终止时终止任务。

如果您在子线程中处理资源管理(即指针或堆上的某些东西),这可能会产生未定义的行为。即使这在父线程中不是明确的,它也可能会在您的程序的其他地方蔓延。

此外,其他程序员可能会感到困惑,他们可能不确定您是有意排除了对 get/wait 的调用还是不小心忘记了

“我只想生个好火然后算了。” -- 那么 std::async 不是正确的工具。只需启动一个线程并将其分离:

std::thread thr(my_function);
thr.detach();

std::async 基本上是关于计算结果,可能在一个单独的线程中,并最终能够访问该结果。它 returns 一个 std::future<whatever> 类型的对象,可以为您提供该结果。如果您不关心结果,则不需要簿记开销。此外,在您尝试获取结果之前,std::async 可能根本不会执行任何操作。因此,如果您不尝试获得结果,就不会在任何有意义的意义上得到“即发即忘”。

如果你想确保没有人会认为你错误地忘记了使用 get,我建议你改用 std::thread,然后调用 .detach在上面。这样就没有人可以调用 .join,因为它不再是 joinable

详情请见:Can I use std::async without waiting for the future limitation?