如果我们想要异步获取线程处理结果,可以使用future与async。async返回一个future对象,等待线程可以在future对象上获取异步线程的处理值。这里的异步,实际上主线程会阻塞。
【一】future的状态
future有三种状态:
std::future_status::deferred; //表示异步线程还未启动
std::future_status::ready; //表示异步线程已经执行完毕,并已经将执行结果写入到future中
std::future_status::timeout; // 表示异步线程处理超时,并没有将结果写入future中
【二】async是否启动线程
async是否启动异步线程,有async第一个参数决定,async接口定义如下:
async(std::launch::async | std::launch::deferred, f, args...)
第一个参数表示异步线程启动的方式,有如下两种方式:
std::launch::async; // 表示表用async函数后,立即启动异步线程
std::launch::deferred; // 表示线程延迟启动,当调用future.get或者future.wait时,才会创建异步线程并启动
而async的默认方式见接口所示:
std::launch::async | std::launch::deferred // 表示是否启动线程由系统负载决定,如果系统负载过重,则可能不启动异步线程计算,则此时future的状态不会为ready, 一般情况下,这种默认设置够用了,但是如果需要一定以异步线程的方式执行,则显示修改启动方式为async
【三】future的四个方法
future<int> fu;
fu.get();
get声明如下: