std::future

C++多线程_std::future与std::promise 在并发编程中,我们通常会用到一组非阻塞的模型:promise\future。在python、js、java中都提供future\promise,是现代语言常用的非阻塞编程模型。 阅读详情

1. future

相关demo详见

promise-demo
packaged_task-demo
furture-demo

1.1. future相关结构

Member functions

fundescpub/priv
(constructor)constructs the future object(public member function)
(destructor)destructs the future object(public member function)
operator=moves the future object(public member function)
sharetransfers the shared state from *this to a shared_future and returns it(public member function)

Getting the result

fundescpub/priv
getreturns the result(public member function)
validchecks if the future has a shared state(public member function)
waitwaits for the result to become available(public member function)
wait_forwaits for the result, returns if it is not available for the specified timeout duration(public member function)
wait_untilwaits for the result, returns if it is not available until specified time point has been reached(public member function)

1.2. async相关结构

简单快捷,简易版std::thread
std::async 并不总会开启新的线程来执行任务,你可以指定 std::launch::async 来强制开启新线程
如果 std::async 返回值 std::future 被存放在一个临时对象中,那么std::async会立马阻塞,因为临时对象在返回后立马被析构了。
std::async( std::launch::async, sleep, 5 ); // 临时对象被析构,阻塞 5s
auto f1 = std::async( std::launch::async, sleep, 5 );如果不調用f1.get(),则std::async可能都不执行

async( Function&& f, Args&&... args );
//policy: std::launch::async,std::launch::deferred,立刻异步执行或调用时再触发异步执行
async( std::launch policy, Function&& f, Args&&... args );
int asyncTime() {
    auto sleep = [](int s) { std::this_thread::sleep_for(std::chrono::seconds(s)); };

    auto start = now();
    std::async(std::launch::async, sleep, 2); // 临时对象被析构,阻塞 2s
    std::cout << "cost:" << sub(start, now()) << std::endl;//cost 2s
    start = now();
    std::async(std::launch::async, sleep, 2); // 临时对象被析构,阻塞 2s
    std::cout << "cost:" << sub(start, now()) << std::endl;//cost 2s
    
    start = now();
    auto f1 = std::async(std::launch::async, sleep, 2);
    std::cout << "cost:" << sub(start, now()) << std::endl;//cost 0s
    start = now();
    auto f2 = std::async(std::launch::async, sleep, 2);
    std::cout << "cost:" << sub(start, now()) << std::endl;//cost 0s
    f2.get();
    std::cout << "cost:" << sub(start, now()) << std::endl;//cost 2s
    return 0;
}

1.3. packaged_task 相关结构

配合 std::thread,可以取代 async
实际上就是std::futrue的封装函数,没啥特殊函数,参数是指向一个函数
可以通过 packaged_task对象直接调用关联函数(支持operator())。

    auto task = [](int i) { 
    std::this_thread::sleep_for(std::chrono::seconds(5)); return i+100; 
    };

    std::packaged_task< int(int) > package{ task };
    std::future<int> f = package.get_future();
    package(1);//直接调用
    std::cout << f.get() << "\n";

    std::packaged_task< int(int) > package2{ task };
    std::future<int> f = package.get_future();
    std::thread t { std::move(package2), 5 };//线程执行
    std::cout << f.get() << std::endl; // 阻塞,直到线程 t 结束
    t.join();

packaged_task

|Member functions

fundescpub/priv
(constructor)constructs the task object(public member function)
(destructor)destructs the task object(public member function)
operator=moves the task object(public member function)
validchecks if the task object has a valid function(public member function)
swapswaps two task objects(public member function)
get_futurereturns a std::future associated with the promised result(public member function)
operator()executes the function(public member function)
make_ready_at_thread_exitexecutes the function ensuring that the result is ready only once the current thread exits(public member function)
resetresets the state abandoning any stored results of previous executions(public member function)
std::swap(std::packaged_task)(C++11)specializes the std::swap algorithm(function template)
std::uses_allocatorstd::packaged_taskspecializes the std::uses_allocator type trait(class template specialization)

1.4. promise相关结构

更像一个线程间同步的封装类,一个调用set_value设置变量,一个调用get_future().get()获取变量

    auto task = [](std::future<int> i) {
        std::cout << i.get() << std::flush; // 阻塞,直到 p.set_value() 被调用
    };

    std::promise<int> p;
    std::thread t{ task, p.get_future() };

    std::this_thread::sleep_for(std::chrono::seconds(5));
    p.set_value(5);

    t.join();

promise

Member functions

fundescpub/priv
(constructor)constructs the promise object(public member function)
(destructor)destructs the promise object(public member function)
operator=assigns the shared state(public member function)
swapswaps two promise objects(public member function)

Getting the result

fundescpub/priv
get_futurereturns a future associated with the promised result(public member function)
set_valuesets the result to specific value(public member function)
set_value_at_thread_exitsets the result to specific value while delivering the notification only at thread exit(public member function)
set_exceptionsets the result to indicate an exception(public member function)
set_exception_at_thread_exitsets the result to indicate an exception while delivering the notification only at thread exit(public member function)
std::swap(std::promise)specializes the std::swap algorithm(function template)
std::uses_allocatorstd::promisespecializes the std::uses_allocator type trait(class template specialization)

1.5. 参考资料

  1. C++11并发指南系列
  2. cppreference
std::future的使用 //传递类参数,智能指针作为线程参数 #include<cstdio> #include<cstdlib> #include<iostream> #include <thread> #include <future> using namespace std; void f(int n) { cout << n &lt... 阅读详情

相关推荐

C++11多线程(八):future用法详解

C++ 11多线程不能直接从thread.join()获得想要的结果,必须定义一个变量,在线程执行时对这个变量赋值,然后执行join(), 过程比较复杂。 std::future可以从异步任务中获取结果,一般与std::async配合使用,std:async用于创建异步任务,实际上就是创建一个线程执行相应任务,然后std::future对象调用get获取该值(...

琅嬛福地 8696

C++库std::future

是C++11标准库(并发支持库)中的一个模板类,它表示一个异步操作的结果。当我们在多线程编程中使用异步任务时,可以帮助我们在需要的时候获取任务的执行结果。的一个重要特性是能够阻塞当前线程,直到异步操作完成,从而确保我们在获取结果时不会遇到未完成的操作。

qq_41898196的博客 1万+

Kubernetes集群资源优化实战:Volcano调度器如何帮你省下30%GPU算力

本文详细介绍了如何通过Volcano调度器的Binpack策略优化Kubernetes集群中的GPU资源利用率,解决AI模型训练中的资源碎片化问题。通过实战配置和调优指南,帮助用户提升30%的GPU算力利用率,显著降低任务等待时间和硬件成本。

weixin_30832143的博客 507

C++ 多线程:std::future

概念我们前面介绍的std::thread 是C++11中提供异步创建多线程的工具,只能是异步运行任务,却无法获取任务执行的结果,一般都是依靠全局对象,全局对象在多线程下是及其不安全的,为此标准库提供了std::future类模板来关联线程运行的函数和函数的返回结果,这种获取结果的方式是异步的。std::future 通常由某个 Provider 创建,你可以把 Provider 想象成一个异步任务的提供者,Provider 在某个线程中设置共享状态的值,与该共享状态相关联的 std::future 对象调用

iuices的博客 1万+

解锁Cherry Studio高阶玩法:用MCP实现自动化测试与数据爬取

本文深入探讨了如何利用MCP协议与Cherry Studio结合,实现自动化测试与数据爬取的高阶应用。通过Playwright等工具的MCP集成方案,详细解析了自动化测试流水线构建和智能爬虫系统开发的关键技术,显著提升工程效率和系统适应性。

defi6farmer的博客 275

CANoe软件之离线报文回放与分析实战

本文详细介绍了如何使用CANoe软件进行离线报文回放与分析,帮助工程师将现场故障数据转化为可反复研究的实验室资源。通过实战步骤,指导如何搭建分析工程、加载DBC文件解码信号,并利用Trace和Graphics窗口进行深度数据筛选与图形化分析,从而高效定位汽车电子故障,是提升诊断效率的关键技能。

weixin_29227585的博客 529

【C++多线程】std::future

std::async是一个函数模板,用于启动一个异步任务。它会返回一个对象,通过这个对象可以获取任务的结果或状态。std::async的核心思想是将任务的执行与调用线程解耦,允许任务在后台运行(可能在新线程中,也可能是延迟执行)。是一个类模板,表示一个异步操作的未来结果。它通常与std::async或配合使用,提供了一种机制来获取异步任务的结果或状态。

m0_49106549的博客 1825

如何用YOLOv5改进无人机小目标检测?MFFSODNet实战教程(附代码)

本文详细介绍了如何利用YOLOv5框架结合MFFSODNet网络结构优化无人机航拍图像中的小目标检测。通过引入微小目标预测头、多尺度特征提取模块(MSFEM)和双向密集特征金字塔网络(BDFPN)等核心技术,显著提升了小目标检测精度。文章提供了完整的代码实现方案,并展示了在农业监测、电力巡检等实际场景中的应用效果。

sre5engineer的博客 738

std::future详解

是 C++ 异步编程的核心组件,用于安全获取异步任务的结果。与std::async配合,绑定异步任务;通过get()获取结果(或异常),wait()wait_for()控制等待行为;状态管理严格,确保结果只能被获取一次,线程安全。掌握有助于编写高效、清晰的并发代码,避免直接操作线程和锁的复杂性。

u010632343的博客 1303

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(1-16)

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(1-16)

weixin_45735391的博客 8万+

13、离散时间系统建模与分析

本文系统介绍了离散时间系统的建模与分析方法,涵盖连续时间模型的离散化过程、系统稳定性判断准则、输入输出模型转换方法以及有限脉冲响应和阶跃响应模型的应用。通过多个示例详细展示了不同系统在离散化过程中的特性变化,并探讨了采样间隔对系统动态特性的影响。此外,文章还分析了时间延迟的处理方法,并总结了关键知识点及操作步骤,为离散时间系统的实际应用提供了理论基础和实践指导。

2w3e4r5t6y的博客 189

C++11之std::future对象使用说明

std::future介绍 在前面几篇文章中基本都用到thread对象,它是C++11中提供异步创建多线程的工具。但是我们想要从线程中返回异步任务结果,一般需要依靠全局变量;从安全角度看,有些不妥;为此C++11提供了std::future类模板,future对象提供访问异步操作结果的机制。 std::future类模板定义头文件<future>,其函数声明如下: template&l...

Keep Moving~ 7万+

一文看懂EMMC原理及工作过程

CMD:用于设备初始化和命令传输的双向通道, CMD信号有2种工作模式:1#:漏极开路--->用于初始化模式2#:推拉--->用于快速命令传输其中命令从eMMC主机控制器发送到eMMC设备,响应从设备发送到主机。DAT [7:0]:双向数据信号,模式包括:1(DAT0);默认情况下,通电或重置后,只有DAT0用于数据传输。DAT信号在推挽模式下工作,eMMC设备包括数据线DAT1-DAT7的内部上拉。进入4位模式后,设备立即断开线路DAT1、DAT2和DAT3的内部上拉;

Airer_00的博客 2031

std::future 和 std::promise

std::future 实际上是持有了 std::promise 的状态(即结果或异常),而不是 std::promise 本身。在使用 std::promise 和 std::future 时,选择使用 std::move 而不是 std::ref 的原因主要与 std::promise 的所有权和生命周期管理有关。使用场景:通常由 std::async、std::promise::get_future() 或 std::packaged_task::get_future() 返回。

akaini的博客 1950

USB驱动(URB)

本文介绍了Linux内核中USB驱动开发的核心概念URB(USB Request Block)。URB是主机与USB设备间传输数据的抽象结构体,包含目标设备、端点信息、数据缓冲区等关键字段。文章详细解析了URB的生命周期(分配、填充、提交、回调、释放)、四种传输类型(控制、批量、中断、等时)及其应用场景,并提供了鼠标设备的中断传输示例代码。最后强调了URB使用注意事项,包括DMA缓冲区分配、错误处理和资源释放等。URB作为USB驱动与内核通信的桥梁,是构建稳定USB驱动程序的基础。

m0_49476241的博客 915

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

std::async、std::future

std::promise通常与std::future一起使用,std::promise在一条线程中获得获得数据,而与之相关联的std::future(promise也有get_future()成员函数)可以在另一个线程中获得这些数据。std::launch::deferred:延迟调用,使用该参数,可以将线程入口函数调用的时间延迟到调用使用std::future的get(),wait()执行前。std::launch::async:在调用async时就调用线程入口函数,并且创建新的线程。

2301_78933228的博客 706

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

std::future和std::promise

C++11标准库提供了std::future和std::promise用于处理异步任务。std::future表示期望值,可以使用期望值等待一次性事件。std::promise表示承诺的意思,std::future可以和std::promise进行绑定。std::promise<T>提供设定值的方式(类型为T),这个类型和std::future<T>对象相关联,期望值可以阻塞等待线程,同时,提供数据的线程可以使用组合中的承诺值来对相关值进行设置,并且将期望值的状态设置为就绪状态。

weixin_47326789的博客 1242

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

关于CPP——std::future异步操作

介绍了C++11中异步操作的函数std::future,主要介绍了 std::future 与 std::async / std::package_task / std::promise 的配合使用完成异步操作

m0_75186846的博客 1449

C++11中std::future的使用

C++11中的std::future是一个模板类。std::future提供了一种用于访问异步操作结果的机制。std::future所引用的共享状态不能与任何其它异步返回的对象共享(与std::shared_future相反)( std::future references shared state that is not shared with any other asynchronous re...

网络资源是无限的 2万+

异步编程之std::future(二): std::future和std::promise原理

异步调用执行方访问这个通道是通过自身持有的std::promise实例来向通道中写入值的,异步调用创建方是通过自身持有的std::future对象实例来获取通道中的值的。当异步调用执行方完成异步调用的执行之后,会通过std::promise对象实例向通道中写入异步调用执行的结果值。异步调用创建方通过自身持有的std::future对象实例来获取异步调用结果 异步调用执行方通过std::promise来兑现承诺(promise,承诺调用完成之后在未来某一时刻交付结果),异步调用创建方通过

红军不怕远征难,万水千山只等闲 1605

C++ std::future与std::promise

当向std::promise设置值时抛出异常,如果没有妥善处理,可能会导致结果永远不会被设置,而等待的std::future将永远阻塞。在调用get()之前,先检查std::future::valid()和std::future::wait_for(),确保操作的安全性。使用std::future::wait_for()或std::future::wait_until()来控制等待时间,避免无限期阻塞。下面的示例展示了如何使用std::async启动一个异步任务,并通过std::future获取结果。

mj348940862的博客 1166

std::future 和 std:: promise

c++11中,有这两个类模板,std::future 和 std:: promise。这两个类的对象在获取值得时候需要相互配合。 std::future,其对象存储的值在未来一定会被改变。如果有线程在这个对象的值还没有改变的时候,通过调用std::future::get()来尝试获取该对象的值得话,那么这个线程就会被阻塞,直到对象的值被改变 std::promise,其对象...

ii0789789789的博客 1511

C++11 异步操作 std::future类

异步编程是一种编程范式,它允许程序在等待某个长时间运行的操作(如文件读写、网络通信或复杂计算)完成时,不会阻塞或挂起执行线程,而是可以继续执行其他任务。这种非阻塞的执行方式可以显著提高程序的响应性和吞吐量。

Yawesh的博客 1605

并发编程(8)—— std::async、std::future 源码解析

解析async和future源码

m0_63086198的博客 1456

c++11 std::future、std::future_status

目录 1、std::future 2、std::future_status 1、std::future template <class T> future; template <class R&> future<R&>; // specialization : T is a reference type (R&) template <> future<void>; // speci..

李白 940

C++ std::future

是用来接收一个线程的执行结果的,并且是一次性的。

Wlk1229 1744
上一篇: go基础
下一篇: 异步调度
knowledgebao
博客等级 码龄15年 401粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值