当前位置: 首页 > news >正文

C++的异步相关操作

目录

一,认识同步与异步

1-1,同步

1-2,异步

二,future

2-1,future介绍

2-2,async函数模板

2-3,packaged_task类模板

2-4,promise类模板


一,认识同步与异步

        同步和异步是处理任务执行顺序的两种不同方式。

1-1,同步

        同步操作意味着任务按顺序执行,一个任务完成后才会开始下一个任务。在同步编程模型中,调用者会等待被调用者完成操作后再继续执行,如单一执行流完成一个具体任务。

特点:

  1. 顺序执行:任务按照调用顺序依次执行。
  2. 阻塞调用:调用者会阻塞,直到被调用者完成操作。
  3. 易于理解和调试:代码逻辑简单明了,因为任务按顺序执行。

1-2,异步

        异步操作意味着任务可以并行执行,调用者不需要等待被调用者完成操作即可继续执行。异步编程模型通常使用回调函数、多线程或线程池来处理。

特点:

  1. 并行执行:任务可以并行执行,提高程序效率。
  2. 非阻塞调用:调用者不会阻塞,继续执行其他任务。
  3. 复杂性增加:代码逻辑可能变得复杂。

二,future

2-1,future介绍

        future是C++11标准库中的⼀个模板类,它表示⼀个异步操作的结果,即保存一个异步任务的结果。它本质不是一个异步任务,而是一个辅助我们获取异步任务结果的东西。通过使用future,我们可以实现线程之间的同步,确保任务完成后再获取结果并继续执行后续操作。

        当我们在多线程编程中使用异步任务时,future可以帮助我们在需要的时候获取任务的执行结果。future的⼀个重要特性是能够阻塞当前线程,直到异步操作完成,从而确保我们在获取结果时不会遇到未完成的操作。

future这里常用的成员函数get():获取异步操作的结果。如果异步操作尚未完成,get方法会阻塞当期线程,直到结果可用返回。

        注意:future只是提供了一种安全的方式来获取异步任务的结果,如:使用future::get()函数来获取任务的结果,此函数会阻塞当前线程,直到异步操作完成。它不能单独使用,需要搭配一些能够执行异步任务的模板类或函数作为返回值一起使用。future对象通常由async、packaged_task、promise方式创建,它们三者都运用了多线程相关的库,g++编译时需链接。

2-2,async函数模板

        在C++中,async 是标准库<future>头文件中提供的一个函数模板,用于异步执行任务。它允许你在不阻塞当前线程的情况下启动一个新任务,并在稍后获取其结果。async 函数返回一个 future 对象,该对象表示异步操作的结果。

async的第一个参数:一个可选的启动策略,它决定了异步任务是如何被执行的。该参数有下面两种选择:

        launch::async:异步执行。它会在内部创建一个线程,任务会在该线程中运行。

        launch::deferred:同步执行。任务不会立即运行,直到future的get或wait方法去获取结果时才会被调用。

        默认情况下,如果不指定启动策略,它会选择最适合的策略,通常是launch::async | launch::deferred。

async的后续参数:后续参数是要异步执行的函数及其参数。可以是函数指针、function、Lambda表达式或可调用对象。

#include <iostream>

#include <future>

using namespace std;

int Add(int num1, int num2)

{

    cout << "Add()" << endl;

    return num1 + num2;

}

int main()

{

    // launch::async策略:内部创建一个线程执行函数,函数运行结果通过future获取

    // launch::deferred策略:同步策略,获取结果的时候再去执行任务

    future<int> res = async(launch::async, Add, 11, 22);

    cout << "--------------------------" << endl;

    cout << res.get() << endl;

    return 0;

}

2-3,packaged_task类模板

        packaged_task是C++11一个将可调用对象(如函数、lambda表达式或函数对象)包装为异步任务的类。它提供了一种将可调用对象(如函数、lambda 表达式、函数对象等)封装起来后放到其它线程中去异步执行。

#include <iostream>

#include <future>

#include <thread>

#include <memory>

using namespace std;

int Add(int num1, int num2)

{

    cout << "Add()" << endl;

    return num1 + num2;

}

int main()

{

    // 封装任务

    auto task = make_shared<packaged_task<int(int, int)>>(Add);

    // 获取任务包关联的future对象

    future<int> res = task->get_future(); // get_future()用于获取关联的future对象

    // 在另一个线程中异步执行封装的任务

    thread thr([task](){ (*task)(11, 22); });

    cout << "--------------------------" << endl;

    // 获取结果

    cout << res.get() << endl;

    thr.join();

    return 0;

}

2-4,promise类模板

        C++中的promise是一个类模板,与packaged_task不同的是,promise是对任务结果的封装。使用时,它实例化的对象返回一个future后,就开始在其它线程中向promise对象设置数据,而其它线程的关联future就可以获取数据。

#include <iostream>

#include <future>

#include <thread>

#include <memory>

using namespace std;

int Add(int num1, int num2)

{

    cout << "Add()" << endl;

    return num1 + num2;

}

int main()

{

    // 在使用的时候,先实例化一个指定结果的promise对象

    promise<int> pro;

    // 通过promise对象,获取关联的future对象

    future<int> res = pro.get_future(); // get_future()用于获取关联的future对象

    // 给promise设置数据,这样可以通过关联的future获取到这个设置的数据了

    thread thr([&pro](){

        int sum = Add(11 , 22);

        pro.set_value(sum); // 设置promise的值,并使与之关联的future对象进入就绪状态

    });

    cout << res.get() << endl;

    thr.join();

    return 0;

}

相关文章:

  • YOLOv10 解析与地平线 征程 6 模型量化
  • 多线程基础系列-线程池
  • 洛谷 P8705:[蓝桥杯 2020 省 B1] 填空题之“试题 E :矩阵” ← 卡特兰数
  • 322.零钱兑换
  • Go语言--语法基础2--下载安装
  • AF3 DataPipeline类process_multiseq_fasta 方法解读
  • [数据结构笔记] 1. 顺序表 内含所有函数C语言代码,完全无伪代码
  • 使用串口工具实现tcp与udp收发
  • Leetcode2717:半有序排列
  • 【原创工具】同文件夹PDF文件合并 By怜渠客
  • 安全见闻4
  • 多功能免费网络测速及问题诊断工具
  • 【C++】:STL详解 —— vector类
  • C++知识整理day9——继承(基类与派生类之间的转换、派生类的默认成员函数、多继承问题)
  • Linux(Centos 7.6)命令详解:uniq
  • 【愚公系列】《Python网络爬虫从入门到精通》034-DataFrame简单数据计算整理
  • 表单制作代码,登录动画背景前端模板
  • 2025网络安全等级测评报告,信息安全风险评估报告(Word模板)
  • DeepSeek开源周Day2:DeepEP - 专为 MoE 模型设计的超高效 GPU 通信库
  • win11 24h2 远程桌面 频繁断开 已失去连接 2025
  • 做网站改版的/全网热搜榜第一名
  • 电脑上wap网站/株洲seo
  • 网站建设电话销售话术实例/莱阳seo外包
  • 本网站只做信息展示/黑帽seo是作弊手法
  • 怎么建设百度网站/西安百度快照优化
  • 东莞网站搜索排名/百度网络营销app下载