C++ 多线程的错误和如何避免(12)

std::async 在简单的 IO 上比 std::thread 更有优势

前提:如果我们只需要一些异步执行的代码,这样不会阻塞主线程的执行,最好的办法是使用 std::async 来执行这些代码。这些操作我们也可以使用 std::thread 创建线程并通过函数指针

或者 lambda 参数将可执行代码传递给线程来实现。但是,在后一种情况下,我们要负责管理线程的创建和加入/分离,以及处理线程中可能发生的任何异常。如果使用 std::async,就可以

摆脱这些麻烦,并大大减少陷入死锁的情况。

使用 std::async 的另一个优势是能够通过 std::future 对象将任务结果传回给调用线程。

比如,假设我们有一个返回 int 的函数 ConjureMagic,我们可以创建一个异步任务,然后设置一个 std::future 变量,这样我们就可以在合适的时候在调用的线程中从 std::future 中提取结果。

// spin an async task and get a handle to the future 
std::future asyncResult2 = std::async(&ConjureMagic);

//... do some processing while the future is being set

// Get the result from the future 
 int v = asyncResult2.get();

相反,使用 std::thread 做这项工作要麻烦得多。这两个选项包括:

  1. 将对结果变量的引用(使用 std::ref)传递给调用的线程。
  2. 将结果存储在函数对象的类成员变量中,一旦线程完成执行,就可以检索该变量。

在性能方面,有研究发现创建线程的成本是使用异步的 14 倍。

总而言之,默认使用 std::async,除非能找到直接使用 std::thread 的充分理由(这部分可以参考另一篇文章:std::async 与 std::thread 在什么时候使用比较合适

 

原文链接: https://www.cnblogs.com/strive-sun/p/16320881.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++ 多线程的错误和如何避免(12)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/404507

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月25日 下午4:36
下一篇 2023年4月25日 下午4:36

相关推荐