当未存储返回值时,std :: async不会生成新线程

inf*_*inf 13 c++ multithreading asynchronous

考虑我有lamba foo只做一些东西,不需要返回任何东西.当我这样做:

std::future<T> handle = std::async(std::launch::async, foo, arg1, arg2);
Run Code Online (Sandbox Code Playgroud)

一切都运行良好,lamba将在一个新的线程中产生.然而,当我不存储std::futurestd::async返回时,foo将在主线程中运行,并阻止它.

std::async(std::launch::async, foo, arg1, arg2);
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

Woj*_*cha 17

来自just::thread 文档:

如果策略std::launch::async然后INVOKE(fff,xyz...)在其自己的线程上运行.std::future当此线程完成时,返回的内容将准备就绪,并将保存函数调用引发的返回值或异常.与返回的异步状态相关联的最后一个对象的析构函数std::future将阻塞,直到将来准备好.

std::async(std::launch::async, foo, arg1, arg2);
Run Code Online (Sandbox Code Playgroud)

返回的未来不会分配到任何地方,它的析构函数阻塞直到foo完成.


Mic*_*ann 5

我想在Herb Sutter的一篇关于异步和〜未来的文章中添加一个链接,其中他认为期货永远都不会受阻。

  • 默认情况下,〜future()实际上并不阻止。它仅在从std :: async返回时才阻塞,因为异步将阻塞状态分配给future,而〜future()必须释放它。 (2认同)