繁体   English   中英

jthread vs std::async - jthread over std::async 的用例是什么

[英]jthread vs std::async - what is the use-case for jthread over std::async

我刚刚偶然发现了 std::jthread: https://en.cppreference.com/w/cpp/thread/jthread

似乎解决了与 std::async/future 已经解决的相同问题(尽管您可能需要强制 async std::async(std::launch::async, ...的行为立即运行。

所以我的问题是使用一个而不是另一个有什么意义? - 有什么不同吗? jthread 是异步/未来的包装器吗?

抽象地说,它们非常相似。 假设一个使用std::launch::async而一个不调用std::jthread::detach 它们都接受同步函数并与当前执行线程同时运行它们。 它们都提供了一种等待完成的方法: std::future::getstd::jthread::join 它们都隐式地自动执行销毁等待。

差异更多地在于特定的细节和保证。

应该注意的是,添加了std::jthread作为对std::thread的修复。 std::threadstd::async一起添加到 C++11 中,同样的问题对这些有效。 因此, std::async还没有“已经”解决了这个问题,它们是一起发布的,就与这个问题相关而言。 std::thread的问题在于它要求用户始终joindetach线程, detach总是错误的,如果用户忘记join ,程序将终止。

返回值的方式存在显着差异。 std::async必须为返回值隐式分配一个共享位置。 这并不总是必要的:有时您不需要值,或者有时您知道异步操作将在当前 function 返回之前完成(因此,捕获的堆栈变量就足够了)。

std::async返回的std::future与以其他方式构造的那些之间存在有意义的区别。 销毁时从std::async块返回的那些,这不是典型的行为。 这使std::future的实现和心理 model 变得复杂。

处理异常的方式有很大的不同。 异常通过std::async传播回来。

因此,评论是当场的。 std::async可以很容易地用std::threadstd::jthread实现,因此它处于更高的级别。 但相反, std::async会做出并不总是最优的隐式选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM