async的使用
2020-07-23 本文已影响0人
夕阳下的不回头
image.png
image.png
async是创建一个异步线程 future可以用来接收这个线程的入口函数的返回值
我们使用result.get()用来等待子线程运行完并返回值(这个时候主线程是不会再往下运行的,必须等子线程运行完才能往下运行熬) future中的wait()就是不需要接收返回值的get(),别的效果是一样的。
launch::deferred表示延迟调用,在调用future中的wait()或者get()函数时,才执行入口函数。(而实际上子线程的语句都是在主线程里执行的,并没有创建新线程,是在主线程中调用的入口函数,下文通过打印线程 id 证明)。
在main中 如果使用async launch::deferred 后面不使用result.get()或者result.wait() 那么会导致这一行无效 不会有新的线程创建
image.png
async传参 launch::deferred 但并不调用result.get()或者result.wait() 则mythread()中语句不会执行
image.png
ascync传参 launch::deferred 调用result.get()或者result.wait() 则mythread()中语句会执行但是不会创建新的线程 而是由主线程运行
image.png
而launch::async是和默认参数(不传参)一样,从这一行开始就运行子线程入口函数中的任务,而不是等到get或者wait那一行
launch::async | launch::deferred
可能创建新线程,也可能延迟调用。系统会根据当前的资源情况选择合适的方式。
不含launch参数时,作用与 launch::async | launch::deferred相同,也是可能创建新线程,也可能延迟调用。