C++11 异步与通信之 std::async

这篇具有很好参考价值的文章主要介绍了C++11 异步与通信之 std::async。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概念简介

std::async 异步运行一个函数,将返回值保存在std::future中。

含有2个策略参数:

  • launch::deferred 延迟执行,当调用wait()和get()时,任务才会被运行,且不创建线程
  • launch::async : 创建线程并执行任务,默认是此类型;
  • 同样的,调用get()方法获取对象时,也是阻塞等待的。

代码示例

使用deferred策略

int Func()
{
    std::cout << "Func Thread id = " << std::this_thread::get_id() << std::endl;
    return 0;
}

int main()
{   
    std::cout << "Main Thread id = " << std::this_thread::get_id() << std::endl;
    //创建延迟任务,这里不会启动新线程
    auto future = std::async(std::launch::deferred, Func);
    //调用future.get()时,才会去调用Func 
    //读者可以试着把这行代码注释掉,你会发现Func函数根本没有创建
    std::cout << "Result =  " << future.get() << std::endl;;
    //通过打印线程id我们发现,是在同一个线程中执行的,没有创建新线程
    return 0;
}

执行结果

Main Thread id = 140646835402560
Result =  Func Thread id = 140646835402560
0

使用async策略

int Func(int n)
{
    std::cout << "Func Thread id = " << std::this_thread::get_id() << std::endl;
    return -1;
}

int main()
{   
    std::cout << "Main Thread id = " << std::this_thread::get_id() << std::endl;
    //创建异步任务 使用默认策略  启动一个新线程
    //并且马上会执行异步任务代码
    auto future = std::async(std::launch::async, Func, 100);
    //通过睡眠发现,get()调用之前,任务已经在被执行了
    std::this_thread::sleep_for(std::chrono::seconds(5));
    std::cout << "Result =  " << future.get() << std::endl;;
    //通过打印线程id我们发现,不是在同一个线程中执行的,创建了新线程
    return 0;
}

运行结果:

Main Thread id = 140052716861248
Func Thread id = 140052716857088
Result =  -1

补充

std::packaged_task相比,std::async不仅可以打包一个异步任务,std::launch::async策略下还可以帮忙创建一个新线程并执行任务,某些场景下比std::packaged_task方便一些。文章来源地址https://www.toymoban.com/news/detail-648270.html

到了这里,关于C++11 异步与通信之 std::async的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】C++11常用新特性

    ✍ 作者 : 阿润菜菜 📖 专栏 : C++ C++11增加的语法特性非常篇幅非常多,我们这里没办法一 一讲解,所以本节主要讲解实际中比较实用的语法。 在C++11中,我们可以使用 {} 列表初始化所有的自定义类型和内置类型,相比于在C语言学习阶段{}一般只用于初始化数组和结构体的

    2024年02月08日
    浏览(34)
  • C++11常用的一部分新特性

    C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自 定义的类型,使用初始化列表时,可添加等号(=),也可不添加。 也就是说这里用花括号进行初始化调用的是类的构造。 也就是说,C++11几乎可以一切都可以用花括号初始化,包括变

    2024年02月06日
    浏览(31)
  • @Async异步线程:Spring 自带的异步解决方案

            在项目应用中,使用MQ异步调用来实现系统性能优化,完成服务间数据同步是常用的技术手段。如果是在同一台服务器内部,不涉及到分布式系统,单纯的想实现部分业务的异步执行,这里介绍一个更简单的异步方法调用。         对于异步方法调用,从Spring3 开

    2023年04月24日
    浏览(48)
  • SpringBoot--@Async异步

    包 注解 整体 异步类需要交给Spring管理 @Component 异步方法需要@Async修饰

    2024年02月11日
    浏览(31)
  • SpringBoot中异步注解@Async介绍

    介绍在SpringBoot项目中,使用@Async不生效的原因介绍和分析; 代码参考gitee仓库:spring-boot-2022-05: 主要是介绍Spring框架注解、常用的功能的使用案例,记录平时遇到的技术知识点,进行实践操作; - Gitee.com 1.启动类中没有添加注解@EnableAsync; 2.同一个类中调用含有@Async的方法;因

    2023年04月17日
    浏览(31)
  • HarmonyOS通过async与await同异步转换 解决异步回调地狱

    我在 HarmonyOS 发送http网络请求 中讲述了 HTTP请求的基本方式 然后 就带出了 回调地狱的问题 然后 上文 HarmonyOS 通过Promise 解决异步回调地狱问题 我们用Promise的解决方案 搞定了 这个问题 但是 Promise 这种写法 可读性其实没有那么优秀 没有搞定 Promise return规则的人甚至都看不懂

    2024年01月24日
    浏览(34)
  • springboot @Async 异步调用接口处理数据

    @Async 异步背景 新增的数据需要分发给下游业务系统,由于下游业务系统状态未知,所以需要异步发送数据给下游业务系统。 系统生效按钮---controller新增--异步调用servcie---数据集成 在springboot框架中实现步骤 首先在启动类上加上 @EnableAsync 注解开启项目的异步调用功能,其次

    2024年02月16日
    浏览(32)
  • Spring之异步任务@Async详解分析

    在 java 中异步线程很重要,比如在业务流处理时,需要通知硬件设备,发短信通知用户,或者需要上传一些图片资源到其他服务器这种耗时的操作,在主线程里处理会阻塞整理流程,而且我们也不需要等待处理结果之后再进行下一步操作,这时候就可以使用异步线程进行处理

    2024年02月01日
    浏览(35)
  • SpringBoot异步方法支持注解@Async应用

    合理使用异步方法可以有效的提高执行效率 同步执行(同在一个线程中): 异步执行(开启额外线程来执行): 在SpringBoot中并不需要我们自己去创建维护线程或者线程池来异步的执行方法, SpringBoot已经提供了异步方法支持注解. service层: controller层: 测试结果: 我们可以感受到接口

    2024年02月11日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包