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::promise
、std::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::async
、std::promise
、std::packaged_task
的底层对象,用来传递其他线程中操作的数据结果。
参考这篇博客,里面有它们之间举例说明代码
https://www.cnblogs.com/moodlxs/p/10111601.html