std::async 的使用以及 C++ 中异步操作的实现

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

背景

在 C++ 中使用一个可调用对象构造一个 std::thread 对象,即可创建一个线程;使用互斥量 std::mutex 来确保多个线程对共享数据的读写操作的同步问题;使用 std::condition_variable 来解决线程执行顺序的同步问题。

异步操作

①.同步操作:在发出一个方法调用时,在没有得到结果之前该调用就不返回。由调用者主动等待这个调用的结果。

②.异步操作:在发出一个方法调用之后,这个调用就直接返回了,没有返回结果。即当一个异步过程调用发出后,调用者不会立刻得到结果。

std::future

std::future 是一个类模板,用来保存一个异步操作的结果,即这是一个未来值,只能在未来某个时候进行获取。

①.get():等待异步操作执行结束并返回结果,若得不到结果就会一直等待。

②.wait():用于等待异步操作执行结束,但并不返回结果。

③.wait_for():阻塞当前流程,等待异步任务运行一段时间后返回其状态 std::future_status,状态是枚举值:

deferred:异步操作还没开始;

ready:异步操作已经完成;

timeout:异步操作超时。

std::async

std::async 是一个函数模板,用来启动一个异步任务。相对于 thread ,std::future 是更高级的抽象,异步返回结果保存在 std::future 中,使用者可以不必进行线程细节的管理。
std::async 有两种启动策略:
①.std::launch::async::函数必须以异步方式运行,即创建新的线程。
②.std::launch::deferred:函数只有在 std:async 所返回的期值的 get 或 wait 得到调用时才执行、并且调用方会阻塞至运行结束,否则不执行。
若没有指定策略,则会执行默认策略,将会由操作系统决定是否启动新的线程。

代码示例

#include "iostream"
#include "future"
using namespace std;

int getDataDemo()
{
  cout << "数据查询开始" << " threadID:" << this_thread::get_id() << endl;
  this_thread::sleep_for(chrono::seconds(5));//模拟耗时
  return 100;
}
int main()
{
  cout << "执行数据查询" << " threadID:" << this_thread::get_id() << endl;
  future<int> m_future = async(launch::async, getDataDemo);//异步执行
//  future<int> m_future = async(launch::deferred, getDataDemo);//延迟执行
//  future<int> m_future = async(getDataDemo);//默认策略
  future_status m_status;
  do 
  {
    m_status = m_future.wait_for(chrono::seconds(1));
    switch (m_status)
    {
    case std::future_status::ready:
      cout << "数据查询完成" << " threadID:" << this_thread::get_id() << endl;
      break;
    case std::future_status::timeout:
      cout << "数据查询中..." << " threadID:" << this_thread::get_id() << endl;
      break;
    case std::future_status::deferred:
      cout << "数据查询延迟" << " threadID:" << this_thread::get_id() << endl;
      m_future.wait();
      break;
    default:
      break;
    }
  }while (m_status != future_status::ready);
  
  int ret = m_future.get();
  cout << "数据查询结果:"<< ret << " threadID:" << this_thread::get_id() << endl;

  system("pause");
    return 0;
}

执行结果如下:
①.异步执行
std::async 的使用以及 C++ 中异步操作的实现
②.延迟执行
std::async 的使用以及 C++ 中异步操作的实现
③.默认策略
std::async 的使用以及 C++ 中异步操作的实现文章来源地址https://www.toymoban.com/news/detail-410305.html

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

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

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

相关文章

  • C++并发编程:std::future、std::async、std::packaged_task与std::promise的深度探索

    1.1 并发编程的概念 (Concept of Concurrent Programming) 并发编程是一种计算机编程技术,其核心在于使程序能够处理多个任务同时进行。在单核处理器上,虽然任何给定的时间只能运行一个任务,但通过任务切换,可以创建出并发执行的效果。而在多核处理器上,可以真正同时处理

    2024年02月05日
    浏览(37)
  • 微信小程序——异步请求使用async/await实现同步

            在小程序的开发中,我们知道网络请求wx.requset是一个异步请求的API,当我们使用它时,会出现请求还没有结束,我们下面写的处理数据的代码就已经执行了从而导致了我们写的程序出现问题,那么我们该怎么解决这个问题呢?今天我们用async/await来实现一下吧。

    2024年02月11日
    浏览(40)
  • Spring Boot使用@Async实现异步调用:自定义线程池

    第一步,先在Spring Boot主类中定义一个线程池,比如: 上面我们通过使用​​ ThreadPoolTaskExecutor ​​创建了一个线程池,同时设置了以下这些参数: 核心线程数10:线程池创建时候初始化的线程数 最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核

    2024年02月14日
    浏览(51)
  • 异步编程的概念 以及async和await的工作原理

    一、引言 二、异步编程的基本概念 三、基于任务的异步模式(TAP) 四、async和await async的工作原理: await的工作原理: 五、异步方法的编写和调用 六、异常处理 七、取消异步操作 八、性能考虑 九、案例:异步下载文件 十、结论 在.NET中,异步编程是一

    2024年04月16日
    浏览(43)
  • CoroutineScope Dispatchers.IO异步操作async返回函数,Kotlin

              主流程开始 ... 1703757127994 分支myFun开始... 1703757127995 分支myFun结束 1703757128042 主流程结束 1703757128042 myFun launch... 1703757128045 myFun delay... 1703757128046 myFun delay end 1703757131050 主流程等待结果返回... main : 3 1703757131052 主流程结果返回 myFun retFun 1703757131052 Process finished with

    2024年02月02日
    浏览(45)
  • vue async await promise 等待异步接口执行完毕再进行下一步操作

    需求:上传多个文件,每上传一个文件异步请求一下后台接口,并返回一个新文件名,等把所有的异步接口执行成功后,将上传已成功后新文件名数组得到再去更新业务数据 uni-file-picker 文件上传组件的配置 选择文件后,上传到服务器后端,一个一个的传,等异步执行完一下

    2024年02月12日
    浏览(50)
  • 深入理解Spring的@Async注解:实现异步方法调用

    在当今高速发展的应用开发领域,对于提升系统性能和响应能力的需求越来越迫切。而异步编程作为一种解决方案,已经成为现代应用开发中的一项重要技术。本篇博客将带您深入探究 Java 中的 @Async 注解,揭示其强大的异步执行能力和精妙的实现机制。 异步编程是一种编程

    2024年02月05日
    浏览(47)
  • Unity C# 之 使用 HttpWebRequest 基础知识/HttpWebRequest 进行异步Post 网络访问/数据流形式获取数据(Task/async/await)的代码简单实现

    目录 Unity C# 之 使用 HttpWebRequest 基础知识/HttpWebRequest 进行异步Post 网络访问/数据流形式获取数据(Task/async/await)的代码简单实现 一、简单介绍 二、实现原理 三、注意事项 四、效果预览 五、关键代码 附录 : HttpWebRequest 的一些基础知识 1、HttpWebRequest 常用属性 2、HttpWebRequest 

    2024年02月05日
    浏览(60)
  • C++ std::chrono库使用指南 (实现C++ 获取日期,时间戳,计时等功能)

    std::chrono 是C++标准库中的一个组件,用于表示和处理时间。其功能就像是心理学中的感知系统,它可以为我们捕捉、量化并操作抽象的时间概念。这就如同我们的大脑可以理解和感知周围环境的时间流逝一样,这种感知和理解能力是人类进行日常活动所必需的。 如同马斯洛的

    2024年02月10日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包