首页 > 其他分享 >std::future概念和使用方法

std::future概念和使用方法

时间:2024-10-08 22:22:49浏览次数:10  
标签:std 异步 task int 概念 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在多线程编程中非常有用,它可以帮助你更好地管理异步任务的结果,避免了手动管理线程和同步机制的复杂性。

标签:std,异步,task,int,概念,future,线程
From: https://blog.csdn.net/weixin_42108533/article/details/142770964

相关文章

  • 二叉树的概念、表示法、性质和操作
    本文记述了二叉树的基本概念、表示法、性质和操作。◆概念二叉树(以下也简称树)是一种存放多个元素的数据结构。每个元素称为结点,每个结点有左、右两个链接,每个链接要么指向其他结点,要么是空链接。某个结点是它的左、右链接指向的结点的父结点,被指向的结点是其父结点的左或右子......
  • std::bind--改变函数参数的局限
    std::bind是C++标准库中的一个工具,用于将函数对象与部分参数绑定在一起,生成一个新的可调用对象。这使得函数的参数可以被部分或全部提前指定,从而得到一个参数更少甚至无参数的函数对象。在某些情况下,它可以用来延迟执行函数、简化函数调用,或在需要无参函数对象的场景中使用(如线......
  • 初始操作系统篇(1)—— 操作系统的概念与分类
    找往期文章包括但不限于本期文章中不懂的知识点:个人主页:我要学编程(ಥ_ಥ)-CSDN博客所属专栏: 操作系统目录操作系统的基本概念 操作系统的概念操作系统的特征并发共享虚拟异步操作系统的目标和功能操作系统的发展与分类手工操作阶段批处理阶段单道批处理系......
  • SpringBoot飘香水果网站:从概念到实现
    3系统分析3.1可行性分析通过对本飘香水果购物网站实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。3.1.1技术可行性本飘香水果购物网站采用JAVA作为开发语言,SpringBoot框架,是基于WEB平......
  • linux 系统用户态与内核态概念
    内核态(KernelMode)和用户态(UserMode)是现代操作系统中两种不同的CPU运行模式,用来保护系统的稳定性和安全性。它们的主要区别在于对硬件资源的访问权限和系统调用的执行上下文。以下是对内核态和用户态的详细解释:1.内核态(KernelMode)定义:内核态是操作系统内核所运行的模式。在......
  • linux 系统CPU 上下文切换(Context Switch)概念
    CPU上下文切换(ContextSwitch)是操作系统调度程序在不同任务之间切换CPU执行的过程。上下文切换的核心是保存当前任务的状态(也叫“上下文”),然后恢复下一个任务的状态,最终交给CPU执行。这种切换可能发生在进程、线程或者内核级别的不同上下文之间。上下文切换的详细过程保......
  • Docker 学习笔记-基本概念与安装
    Docker学习笔记基本概念镜像:Docker的镜像概念类似于虚拟机里的镜像,是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。DockerFile;镜像可以基于DockerFile构建,DockerFile是一个描述文件,里面包含若干条命令,每条命令都会对基础文件系统创建新......
  • 解决undefined reference to `google::protobuf::MessageLite::SerializeToString(std
    按照如下步骤安装了proto:https://zhuanlan.zhihu.com/p/631291781但是在后续的protoBuf测试demo中出现了问题 root@e23598ae2d28:/home/lee/Code/protof_test#g++test.cccontacts.pb.cc-otest_proto-lprotobuf-std=c++11-lpthread/tmp/ccbTc1bj.o:Infunction`......
  • `std::future`--异步的优势
    std::future相比于直接使用线程在C++中有几个重要的优势,主要体现在同步结果获取、简化代码管理、以及更安全的异步任务管理等方面。以下是std::future的一些主要优势:1.自动结果获取与同步std::future提供了一种便捷的机制来获取异步任务的返回值。当我们使用线程时,通常......
  • std::packaged_task<返回类型(参数类型)>
    std::packaged_task概述std::packaged_task是C++11引入的标准库模板类,用于包装一个可调用对象(如函数、lambda表达式、函数对象等),使其能够与std::future协同工作。简单来说,它将一个任务(可调用对象)包装起来,并允许你获取该任务的执行结果,这样你可以在一个线程中执行任务,并在......