2014-09-12 86 views
30

任何人都可以给出关于何时使用它们的高层次直觉?何时使用std :: async vs std :: threads?

参考文献:

+0

使用哪一个你知道如何适用于你的问题。有些问题可以更好地映射到其中一个,这自然会反映在您的想法中。 – 2014-09-12 18:17:50

+0

但它们是否相同?我不这么认为。 std :: async是为了简化生活还是解决以前的C++问题? – 2014-09-12 18:19:46

+2

有趣的阅读(关于'std :: async')如果使用g ++:[async(f)不是。](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51617),还有[this](http://stackoverflow.com/questions/17963172/why-using-stdasync-from-c11) – streppel 2014-09-12 18:29:11

回答

28

这不是一个真正的非此即彼的事情 - 你可以利用期货(与承诺一起)与手动创建的std ::线程。使用std::async是一种便捷的方法,可以为一些异步计算启动线程,并通过未来编组结果,但std::async在当前标准中相当有限。如果接受来自微软PPL的建议扩展,则它将变得更有用。

当前,std::async可能最适合处理非常长时间运行的计算或长时间运行的IO,适用于相当简单的程序。尽管如此,它并不能保证低开销(实际上它的指定方式使得难以在幕后实现线程池),所以它不适合更细粒度的工作负载。为此,您需要使用std::thread来滚动您自己的线程池,或者使用诸如Microsoft的PPL或Intel的TBB之类的东西。

您还可以使用std::thread作为以传统和便携方式编写的'传统'POSIX线程样式代码。

巴尔托什卢斯基讨论了一些办法std::async的限制,目前在他的文章中指定Async Tasks in C++11: Not Quite There Yet

+0

因此,如果我想编写高效的代码(或者线程被创建并频繁地加入)最好坚持传统的线程? – 2014-09-12 18:24:21

+2

好的线程被创建和频繁地加入是你想避免高效的代码:)这是std :: async的问题 - 它很可能通过发射一个新的线程而不是线程池来实现。如果你想要高效的细粒度线程工作负载,你通常需要像线程池这样的东西。 – mattnewport 2014-09-12 18:27:16

+1

@mattnewport:其实,['std :: async'最经常使用线程池](http://stackoverflow.com/questions/15666443/which-stdasync-implementations-use-thread-pools)。但它不是必需的。 – 2014-09-12 18:29:53

4

一个简单的原因,我发现的是,当你想一个方法来检测(通过轮询)是否异步的情况下工作已经完成。随着std::thread,你必须自己管理它。使用std::async,您可以查询std::future::valid()(或使用std::future::wait_for/wait_until(...))以了解何时完成。

相关问题