C++11标准增加async接口,便于异步执行任务,使用async会遇到两个奇怪的问题:
第一, 为什么异步任务有时马上执行,有时很久才执行,甚至不执行。
第二, 日志如果有打印线程ID,会发现不同任务的日志输出线程ID有时一样。
C++11async有两个版本:
版本1:future async(Function f, Args&&…args)
版本2:future async(launch policy, Function f,Args&&… args)
这两个版本都有Function和Args参数用于描述一个任务的入口函数和参数,并返回future对象,future对象用于获取任务执行结果。不同的地方在于版本2多一个参数launch。
版本2的launch参数有2个取值:launch::async 和 launch::deferred。
launch::async会马上启动一个线程来执行任务。
launch::deferred不会马上执行任务,而是等调用future.get()或future.wait()才在当前线程中执行任务。
当未设置launch参数时调用版本1的async,其内部可能采用launch::async,也可能采用launch::deferred,所以异步任务有时会马上执行,有时不会。如果希望马上执行,显示调用版本2。
设置launch参数为launch::async,启动一个线程来执行任务,该线程可能是线程池的某个线程,它执行完任务后会执行下一个任务,于是不同任务的日志输出线程ID可能会一样。