10 —— std::async()深入谈

一 std::async()的四种参数使用情况

A std::launch::deferred 延迟异步任务调用,并不创建新线程。等future对象调用get()或者wait()时才去执行线程入口函数,如果没调用,则不执行。
B std::launch::async 强制这个异步任务在新线程上执行。这意味着系统必须创建出新线程来执行线程入口函数。
C std::launch::deferred | std::launch::async 让系统来决定A或者B行为。
D 不带额外参数 等同于情况C。系统会自行决定是异步(创建新线程)还是同步方式(不创建线程)运行。如果系统资源紧张,则不会创建新线程,采取A方式。如果能创建新线程,则使用B情况。

二 std::async()与std::thread的区别

  1. std::thread创建线程,如果系统资源紧张,会创建线程失败,那么整个程序会报异常奔溃。
  2. std::async()更方便取得结果,并且可能不会创建新线程。

三 std::async不确定性问题解决

通过下面这种方法来判断:

	std::future_status status = result.wait_for(0s); 
	if (status == std::future_status::timeout)	
	{
		// 表示线程还没有执行完
		cout << "time out" << endl;
	}
	else if (status == std::future_status::ready)	//	执行完毕
	{
		// 表示成功返回
		cout << "mythread execute finished" << endl;
		cout << result.get() << endl;
	}
	else if (status == std::future_status::deferred)	//	延迟执行
	{
		//	如果async的第一个参数被设置为std::launch::deferred,则本条件成立
		//	根本没有创建子线程
		//	此时result.wait_for()不会卡住主流程,直接跳到这里。
		cout << "deferred " << endl;
		cout << result.get() << endl;
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值