我想知道使用它有多合适std::async
在面向性能的代码中。具体来说
- 从工作线程捕获异常到主线程是否有任何惩罚?
- 如何从worker返回到main的值?
- ref 传递的输入参数实际上永远不会被复制吗?
我计划将一个繁重的会话对象传递给线程或写入std::async
.
bool fun(MySession& sessRef);
MySession sess;
auto r = std::async(&fun, sess);
EDIT:
- 我计划将它与 GCC 4.9.1 和 VS2013 一起使用,因为该应用程序与平台无关。然而,大多数部署都是基于 *nix 的,所以至少 GCC 应该是高性能的。
我们无法准确判断“std::async 是如何实现的”,因为您并不是指实际提供该实现的特定工具链。
1.从工作线程捕获异常到主线程是否有任何惩罚?
Define “惩罚”究竟是通过什么方式?除非您澄清您的疑虑/要求,否则无法回答这个问题。
通常不应该有任何penalty,通过捕获线程中的异常,就创建了抛出异常。这只是关于异常可以通过以下方式提供给创建线程join()
,这会导致通过处理来保留特定异常的一些成本join()
.
2.如何从worker返回到main的值?
引用什么是C++ 标准定义 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3376.pdf关于这一点说:
30.6.8 函数模板异步
4 Returns: An object of type future<typename result_of<typename decay<F>::type(typename decay<Args>::type...)>::type> http://en.cppreference.com/w/cpp/thread/future that refers to the shared state created by this call to async
.
3.ref 传递的输入参数实际上永远不会被复制还是
不是?
这一点在这里详细回答:通过引用将参数传递给 std::async 失败 https://stackoverflow.com/a/18360675/1413395。如您所见,默认情况下它们被复制。
根据@Yakk https://stackoverflow.com/users/1774667/yakk的评论,可能可以通过以下方式传递这些参数std::ref http://en.cppreference.com/w/cpp/utility/functional/ref避免对副本进行操作,但要获取参考。
how is std::async
实施的
我只能告诉 C++ 标准要求,它是如何应该实施,除非您指的是特定的工具链,否则它会尝试提供正确的实现std::async
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)