不,如果您使用该std::launch::async
策略,那么它会在新线程中异步运行。如果您不指定策略,它可能会在新线程中运行。
基本上在你调用与你的异步函数 foo 关联的未来的行中,程序会阻塞,直到 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();
通过指定启动策略,您可以强制异步执行,如果您在执行时执行其他工作,那么结果将在您需要时准备好。