回答
这不是一个真正的非此即彼的事情 - 你可以利用期货(与承诺一起)与手动创建的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
因此,如果我想编写高效的代码(或者线程被创建并频繁地加入)最好坚持传统的线程? – 2014-09-12 18:24:21
好的线程被创建和频繁地加入是你想避免高效的代码:)这是std :: async的问题 - 它很可能通过发射一个新的线程而不是线程池来实现。如果你想要高效的细粒度线程工作负载,你通常需要像线程池这样的东西。 – mattnewport 2014-09-12 18:27:16
@mattnewport:其实,['std :: async'最经常使用线程池](http://stackoverflow.com/questions/15666443/which-stdasync-implementations-use-thread-pools)。但它不是必需的。 – 2014-09-12 18:29:53
一个简单的原因,我发现的是,当你想一个方法来检测(通过轮询)是否异步的情况下工作已经完成。随着std::thread
,你必须自己管理它。使用std::async
,您可以查询std::future::valid()
(或使用std::future::wait_for/wait_until(...)
)以了解何时完成。
- 1. 有条件的std :: future和std :: async
- 2. std :: mem_fun vs std :: mem_fn
- 3. 用std :: async编辑数组
- 4. GCC的行为与std :: async(std :: launch :: async)与Clang的行为
- 5. std :: list vs std :: vector迭代
- 6. 区别:std :: runtime_error vs std :: exception()
- 7. snprintf vs std :: stringstream
- 8. 如何使用std :: istringstream使用std :: wstring?
- 9. std ::使用std :: promise时的Future_error
- 10. std :: async - 与实现相关的用法?
- 11. 的std ::时辰:: SYSTEM_CLOCK VS的std ::时辰:: high_resolution_clock行为
- 12. 通过使用std :: get,std :: tuple_size,std :: tuple_element
- 13. 有没有一种方法可以在std :: experimental :: future中使用std :: async?
- 14. std:排序vs插入std :: set
- 15. 的std ::领带VS的std :: make_tuple
- 16. 的std ::删除VS的std ::的remove_if
- 17. typedef std :: runtime_error MyError vs class MyError:public std :: runtime_error
- 18. 使用std :: map与std :: string键vs int键的代价?
- 19. 如何避免在重用std :: stringstream变量时使用std :: stringstream.str()和std :: stringstream.clear()?
- 20. 使用std :: thread与std :: mutex
- 21. 在std :: unique_ptr中使用std :: bind in lambda
- 22. 使用std :: thread使用std :: map的意外行为
- 23. 使用std :: list时使用std :: string的内存泄漏<std::string>
- 24. 什么时候应该实现std :: convert :: From vs std :: convert :: Into?
- 25. 如何处理不断发展的C++ std :: namespace?例如:std :: tr1 :: shared_ptr vs. std :: shared_ptr vs. boost :: shared_ptr vs. boost :: tr1 :: shared_ptr
- 26. std :: async - 参数向量被破坏
- 27. 等效于std :: async()的提升
- 28. std :: async中的奇怪行为
- 29. 与std :: async并行的控制程度
- 30. 使用std :: lower_bound与std :: vector :: const_iterator
使用哪一个你知道如何适用于你的问题。有些问题可以更好地映射到其中一个,这自然会反映在您的想法中。 – 2014-09-12 18:17:50
但它们是否相同?我不这么认为。 std :: async是为了简化生活还是解决以前的C++问题? – 2014-09-12 18:19:46
有趣的阅读(关于'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