async与future

一、async

1.原型:

async(launch::async|launch::deferred,

        _STDforward<_Fty>(_Fnarg),

        _STDforward<_ArgTypes>(_Args)...

        );

async(_STDforward<_Fty>(_Fnarg),

        _STDforward<_ArgTypes>(_Args)...

        );

2.模式

async有两种模式,一种是发射模式,一种是默认模式。

(1)发射模式类型分两种:

a.  launch::async//立即启动

b.  launch::deferred //延迟启动,非异步操作

延迟启动,由async函数返回对象的get()或者wait()函数来真正启动线程,这是一个非异步操作。

备注:如果立即启动时,而又不具备启动线程的条件,我没有模拟这种情况,留待各位测试。

(2)    默认模式

C++标准库》解释,这个模式不保证线程一定启动,如果不具备启动线程的条件(比如系统线程数量不足的情况),会被延迟启动。

(3)返回对象

返回对象的是future引用类型的。当这个future对象被析构时,会等待线程执行完成。这个是只调用async(launch::async,func)函数时,线程被迟滞原因。

二.future

         如果仔细观察,可以发现async函数的返回值是future类型的。那我们可以通过future来做什么呢?

         1. future.get()

           a. 如果线程工作完成,通过这个函数获取返回结果;

           b. 如果线程未启动,get()会启动完成,并阻塞调用get()的线程,等待返回结果;

           c. 如果线程未执行完成,阻塞调用get()的线程,等待返回结果;

           d. 每个future只能调用一次get(),如果需要调用多次,可以使用shared_future;

         2.  wait() 等待线程结束

3.  wait_for(std::chrono::) 返回线程状态,需要保证线程已经启动,不然返回的状态不准确。

         4.  valid() 返回线程状态,需要保证线程已经启动,不然返回的状态不准确。

猜你喜欢

转载自blog.csdn.net/chicaidecaiji/article/details/81018692