回答
这不是一个真正的非此即彼的事情 - 你可以利用期货(与承诺一起)与手动创建的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 :: async(std :: launch :: async,func())而不是func()?
- 2. 用std :: launch :: sync模拟std :: async?
- 3. std :: vector vs std :: insert
- 4. std :: mem_fun vs std :: mem_fn
- 5. std :: async和std ::将来的行为
- 6. 有条件的std :: future和std :: async
- 7. 用std :: async编辑数组
- 8. GCC的行为与std :: async(std :: launch :: async)与Clang的行为
- 9. 为什么要使用std :: async?
- 10. 在构造函数中使用std :: async
- 11. std :: unique_ptr :: release()vs std :: move()
- 12. std :: move VS std ::转发
- 13. std :: list vs std :: vector迭代
- 14. 区别:std :: runtime_error vs std :: exception()
- 15. setrlimit()不影响衍生的std :: threads
- 16. 可以std :: async调用std :: function对象吗?
- 17. Functors vs. std :: bind
- 18. snprintf vs std :: stringstream
- 19. 如何使用std :: istringstream使用std :: wstring?
- 20. std ::使用std :: promise时的Future_error
- 21. 如何将对象移动到std :: async()?
- 22. std :: async variant对集合起作用
- 23. std :: async - 与实现相关的用法?
- 24. 当使用std :: async时,C++“无法推导出模板参数”
- 25. 很多时候使用std :: async为小任务性能友好?
- 26. 可以使用boost :: threads中的std :: this_thread *函数吗?
- 27. 的std ::时辰:: SYSTEM_CLOCK VS的std ::时辰:: high_resolution_clock行为
- 28. 通过使用std :: get,std :: tuple_size,std :: tuple_element
- 29. 的std ::删除VS的std ::的remove_if
- 30. std:排序vs插入std :: set
使用哪一个你知道如何适用于你的问题。有些问题可以更好地映射到其中一个,这自然会反映在您的想法中。 – 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