std::async是如何实现的
How is std::async implemented?
我想知道在面向性能的代码中使用std::async
有多合适。特别是
- 从工作线程到主线程捕获异常会受到惩罚吗
- 值是如何从worker返回到main的
- ref传递的输入参数是否真的从未被复制
我计划将一个重会话对象传递给线程或编写std::async
。
bool fun(MySession& sessRef);
MySession sess;
auto r = std::async(&fun, sess);
编辑:
- 我计划将它与GCC 4.9.1和VS2013一起使用,因为该应用程序与平台无关。然而,大多数部署都是基于*nix的,因此GCC至少应该具有性能
我们不能确切地告诉"std::async是如何实现的",因为您指的不是实际提供该实现的特定工具链。
1.从工作线程到主线程捕获异常是否会受到惩罚?
定义"惩罚"的确切含义是什么?除非你澄清你的顾虑/要求,否则这是无法回答的
通常不应该有任何惩罚,只需在创建抛出异常的线程中捕获异常。只是可以通过join()
将异常提供给创建线程,这会导致通过处理join()
来保持特定异常的一些成本。
2.值是如何从worker返回到main的?
引用c++标准定义对这一点的看法:
30.6.8功能模板async
4返回:一个类型为
future<typename result_of<typename decay<F>::type(typename decay<Args>::type...)>::type>
的对象,该对象引用此对async
的调用所创建的共享状态。
3.ref传递的输入参数是否从未被复制或不
这里详细回答了这一点:通过引用向std::async传递参数失败。如您所见,在默认情况下,它们被复制
根据@Yakk的评论,可以通过std::ref
传递这些参数,以避免对副本进行操作,但需要引用。
std::async
是如何实现的
我只能告诉c++标准需求,它应该如何实现,除非你指的是一个特定的工具链,它试图提供std::async
的正确实现。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 如何实现内部实现依赖于模板参数的类
- 我的 PRNG 实现与我尝试复制的实现有何不同?