一、async
1、头文件#include <thread>
async()会自动创建一个线程去执行函数,返回类型为future。
函数原型:
//(C++11 起) (C++17 前)
template< class Function, class... Args>
std::future<std::result_of_t<std::decay_t<Function>(std::decay_t<Args>...)>>
async( Function&& f, Args&&... args );
//(C++11 起) (C++17 前)
template< class Function, class... Args >
std::future<std::result_of_t<std::decay_t<Function>(std::decay_t<Args>...)>>
async( std::launch policy, Function&& f, Args&&... args );
第一个参数是线程创建的策略:
std::launch::async:在调用async就开始创建线程。
std::launch::deferred:延迟加载方式创建线程。调用async时不创建线程,直到调用了future的get或者wait时才创建线程。
默认策略是:std::launch::async | std::launch::deferred
二、future
使用future可以拿到异步线程函数的返回值。
future不支持拷贝构造,只支持移动构造,只允许一个future对象有权限获得结果。
成员函数:
get()会释放原来的指针:
想要实现共享,需要用shared_future
_Res
get()
{
typename _Base_type::_Reset __reset(*this);
return std::move(this->_M_get_result()._M_value());
}
get() | 阻塞,直到线程函数执行完毕,返回线程函数返回值。get函数会释放future绑定的对象。 |
wait() | 在线程函数完成前一直阻塞。 |
wait_for() | 等待future对象的异步线程在一段时间段内是否执行完毕,返回future_state。阻塞 |
wait_until() | 等待future对象的异步线程在一个时间点是否执行结束,返回future_state。阻塞 |
share() | 获取std::future的所有权,移动语义 |
valid() | 判断该future对象是否有效 |
future_state:
deferred | 异步操作还未开始 |
ready | 异步操作已经完成 |
timeout | 异步操作超时,主要用于std::future<T>.wait_for() |
三、promise
promise可以保存template<typename T>类型的对象,该值可以被future对象读取(该future对象可能在另一个线程中),是一种线程同步的手段。
promise只能被set一次。
promise和future类似于消息的管道,但是是一次性的。