不,如果您使用该std::launch::async
策略,那么它将在新线程中异步运行。如果您未指定策略,则它可能会在新线程中运行。
基本上在调用与异步函数foo相关联的future的行中,该程序会阻塞,直到foo执行完毕为止。
它仅在foo还没有完成的情况下才阻塞,但是如果它是异步运行的(例如,因为您使用该std::launch::async
策略),则它可能在需要之前就已经完成了。
- 它取决于与其他库完全相同的外部库,以及更好的非阻塞解决方案,这意味着pthread,如果要使用std :: async,则需要pthread。
错,不必使用Pthreads来实现(在Windows上不是,它使用ConcRT功能。)
在这一点上,我很自然地问为什么甚至在一组简单的函子上都选择std :: async?
因为它保证线程安全,并在线程间传播异常。您可以使用一组简单的函子来做到这一点吗?
该解决方案甚至根本无法扩展,您调用的未来越多,程序的响应性就越差。
不必要。如果您未指定启动策略,那么智能实现可以决定是否启动新线程,返回延迟函数或返回稍后决定的事情(更多资源可用时)。
现在,确实可以使用GCC的实现,如果您不提供启动策略,那么在当前版本中,它将永远不会在新线程中运行(有bugzilla报告),但这是该实现的属性,而不是std::async
一般情况。您不应将标准中的规范与特定实现混淆。阅读一个标准库的实现是了解C ++ 11的糟糕方法。
您能否显示一个示例,该示例被授予以异步,非阻塞方式执行?
这不应阻止:
auto fut = std::async(std::launch::async, doSomethingThatTakesTenSeconds);
auto result1 = doSomethingThatTakesTwentySeconds();
auto result2 = fut.get();
通过指定启动策略,您可以强制异步执行,如果在执行过程中执行其他工作,则结果将在需要时准备就绪。
future.get()