任何人都可以高度直觉地知道何时使用它们?
参考文献:
答案 0 :(得分:33)
它不是一个或者的东西 - 你可以使用手工创建的std :: threads进行期货(连同promises)。使用std::async
是一种方便的方法来触发一个线程进行一些异步计算,并通过将来封送结果,但std::async
在当前标准中相当有限。如果接受来自Microsoft PPL的一些想法的建议扩展被接受,它将变得更有用。
目前,std::async
可能最适合处理非常长时间运行的计算或长时间运行的IO以用于相当简单的程序。它并不能保证低开销(实际上它的指定方式使得在后台使用线程池很难实现),因此它不适合更细粒度的工作负载。为此,您需要使用std::thread
滚动自己的线程池,或者使用Microsoft的PPL或Intel的TBB。
您也可以使用std::thread
来传播'传统' POSIX线程样式代码以更现代和可移植的方式编写。
Bartosz Milewski在他的文章Async Tasks in C++11: Not Quite There Yet
中讨论了std::async
目前的一些局限性
答案 1 :(得分:5)
我发现的一个简单原因是,您需要一种方法来检测(通过轮询)是否完成了异步作业。使用std::thread
,您必须自己管理它。使用std::async
,您可以查询std::future::valid()
(或使用std::future::wait_for/wait_until(...)
)了解何时完成。
答案 2 :(得分:2)
在std::futrue
上使用std::thread
的一个用例是您要调用一个返回值的函数。当您想要函数的返回值时,可以调用将来的get()
方法。
std::thread
没有提供获取函数返回值的直接方法。