何时使用std :: async vs std :: threads?

时间:2014-09-12 18:15:05

标签: c++ multithreading c++11 stdasync

3 个答案:

答案 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没有提供获取函数返回值的直接方法。