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

std::future概念和使用方法

1 概念

  • std::future是 C++ 标准库中<future>头文件提供的一个模板类,用于异步操作的结果获取。它提供了一种访问异步操作结果的机制,通常与std::asyncstd::packaged_taskstd::promise一起使用。
  • 异步操作可以在另一个线程中执行,std::future对象允许当前线程在需要的时候获取异步操作的结果,并且可以检查异步操作是否已经完成。

2 使用方法

1. 包含头文件

在使用std::future之前,需要包含<future>头文件:

#include <future>

2. 与std::async一起使用

  • std::async会自动创建一个新的线程或者在当前线程的空闲时间执行异步任务,并返回一个std::future对象来保存任务的结果。
#include <iostream>
#include <future>

int add(int a, int b) 
{
    return a + b;
}

int main() 
{
    // 异步执行add函数,返回一个std::future对象
    std::future<int> result = std::async(add, 3, 4);
    // 获取异步操作的结果,如果任务还没有完成,会阻塞当前线程直到任务完成
    int sum = result.get();
    std::cout << "Result: " << sum << std::endl;
    return 0;
}

3. 与std::packaged_task一起使用

  • std::packaged_task将一个可调用对象(如函数、函数对象等)包装起来,使其可以异步执行,然后可以通过get_future方法获取对应的std::future对象。
#include <iostream>
#include <future>

int add(int a, int b) 
{
    return a + b;
}

int main() 
{
    std::packaged_task<int(int, int)> task(add);
    std::future<int> result = task.get_future();
    // 可以在另一个线程中执行task
    task(3, 4);
    int sum = result.get();
    std::cout << "Result: " << sum << std::endl;
    return 0;
}

4. 与std::promise一起使用

  • std::promise用于在一个线程中设置一个值(或者异常),然后在另一个线程中通过与之关联的std::future对象来获取这个值(或者异常)。
#include <iostream>
#include <future>

int main()
{
    std::promise<int> prom;
    std::future<int> result = prom.get_future();
    // 在另一个线程中可以执行如下操作
    // prom.set_value(10);
    int value = result.get();
    std::cout << "Value: " << value << std::endl;
    return 0;
}

std::future在多线程编程中非常有用,它可以帮助你更好地管理异步任务的结果,避免了手动管理线程和同步机制的复杂性。


http://www.kler.cn/news/339283.html

相关文章:

  • Arduino UNO R3自学笔记23 之 Arduino如何使用4511控制数码管?
  • 最佳实践(1)
  • `pandas` 库提供了一个非常方便的方法将 DataFrame 转换为字典
  • 2024年最新版本神马TV8.5影视APP源码 293TV影视点播系统源码搭建教程 神马TV8.2加强版反编译教程 保姆级小白可搭建 完整版本视频教程
  • 揭开DNA实验室装修的秘密:水电管道设计的关键要点
  • C# 自适应屏幕分辨率
  • Python从入门到高手4.3节-掌握跳转控制语句
  • 02_InFluxDb
  • MHA携手Atlas:打造高效读写分离解决方案,引领数据库性能飞跃
  • C++学习笔记----8、掌握类与对象(四)---- 不同类型的数据成员(2)
  • Sym-NCO:利用对称性进行神经组合优化
  • 餐饮生存战:平价消费时代,别盲目卷低价
  • 2.4Mybatis——缓存机制
  • 算法:前缀和算法模版
  • [笔记] 仿射变换性质的代数证明
  • PyQt入门指南一 框架介绍
  • 一分钟掌握 Java22 新特性
  • STM32-HAL库 驱动DS18B20温度传感器 -- 2024.10.8
  • 数据结构——排序(插入排序)
  • VAD 论文学习