前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++11 async那些奇怪的问题

C++11 async那些奇怪的问题

作者头像
gaigai
发布2019-08-30 11:46:39
9940
发布2019-08-30 11:46:39
举报
文章被收录于专栏:Windows开发

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可能会一样。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Windows开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档