【C++】关于std::future与std::async、std::promise、std::packaged_task的示例

C++标准程序库使用future来模拟这类一次性事件:

若线程需等待某个特定的一次性事件发生,则会以恰当的方式取得一个future,它代表目标事件;接着,该线程就能一边执行其他任务(光顾机场茶座),一边在future上等待;同时,它以短暂的间隔反复查验目标事件是否已经发生(查看出发时刻表)。这个线程也可以转换运行模式,先不等目标事件发生,直接暂缓当前任务,而切换到别的任务,及至必要时,才回头等待future准备就绪。future可能与数据关联(如航班的登机口),也可能未关联。一旦目标事件发生,其future即进入就绪状态,无法重置。

总之,可以先保存一个事件(创建future对象),在未来获取事件的结果,
主线程既可使用std::future::get获取结果,如果调用过程中,任务尚未完成,则主线程阻塞至任务完成。主线程也可使用std::future::wait_for等待结果返回,wait_for可设置超时时间,如果在超时时间之内任务完成,则返回std::future_status::ready状态;如果在超时时间之内任务尚未完成,则返回std::future_status::timeout状态。

std::future提供了一种访问异步操作结果的机制。从字面意思来理解,它表示未来。这个名字很贴切,因为一个异步操作是不可能马上就获取结果的,只能在未来的某个时候获取;但是我们可以以同步等待的方式来获取结果,可以通过查询future的状态(future_status)来获取异步操作的结果。future_status有三种状态:

deferred:异步操作还没开始
ready:异步操作已经完成
timeout:异步操作超时

一、std::future与std::async

std::async是一种将任务与std::future关联的简单方法。它创建并运行一个异步任务,并返回一个与该任务结果关联的std::future对象。

std::async就是异步编程的高级封装,封装了std::future的操作,基本上可以代替std::thread 的所有事情。

std::async的操作,其实相当于封装了std::promisestd::packaged_task加上std::thread

二、std::future与std::promise

std::promise的作用就是提供一个不同线程之间的数据同步机制,它可以存储一个某种类型的值,并将其传递给对应的future, 即使这个future不在同一个线程中也可以安全的访问到这个值,我们也可以使用std::promise对象来显式地设置任务的结果。

三、std::future与std::packaged_task

std::packaged_task的作用就是提供一个不同线程之间的数据同步机制,它可以存储一个函数操作,并将其返回值传递给对应的future, 而这个future在另外一个线程中也可以安全的访问到这个值。

总结

future对象是std::asyncstd::promisestd::packaged_task的底层对象,用来传递其他线程中操作的数据结果。
参考这篇博客,里面有它们之间举例说明代码

https://www.cnblogs.com/moodlxs/p/10111601.html
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值