C++异步操作中的future/promise

本文介绍了C++11中的std::future、std::promise、std::packaged_task和std::async在异步操作中的使用。std::future用于保存异步操作结果,std::packaged_task封装函数并保存结果到future,std::async是便捷的异步执行工具。std::promise允许设置结果,而std::shared_future允许多个对象共享状态。最后,文章总结了这些类的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

std::future、std::promise是在C++11中出现的类,定义在<future>中,在C++20以前,异步操作主要依靠它们以及其它一些类、函数等来完成。C++20中引入了coroutine,从语言层面而不仅是实现方法层面实现异步操作,但coroutine中也涉及到std::future等对象,因此需要先理解一下这些C++11就出现的类,下一篇再介绍C++20的coroutine。

std::future

std::future可以保存某一操作(函数)的结果,因而也可以用来在不同的线程间传递这一结果。std::future最通常的用法是在把慢速线程的结果放到一个future对象,在另一个线程中可wait and get这个“将来”可能得到的结果,这就是其名称的意义。要注意的是,future的状态是独享的,即一个操作(函数)的结果只能与一个future对象关联,并且只能get一次(效果等同于std::move(结果值))。

std:: packaged_task

std::packaged_task提供对某函数的封装,然后同步/异步运行该函数,函数结果(返回值或异常)保存在其内部的一个future对象中。在std::packaged_task的构造函数中提供需要封装的函数,形式可以是独立的函数、lamda函数、std::bind的函数,在std::packaged_task::operator ()中真正运行该函数,并提供必要的函数参数。需要注意的是,std::packaged_task:: get_future只能调用一次,即函数结果只能被一个future对象所拥有。
packaged_task的用法简单示意如下:

void test_packaged_task()
{
    std::packaged_task<int(int,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值