C++11 并发与多线程(十一、std::async详细)

一、std::async参数详述
  1. 作用:创建一个异步任务(可以用来创建线程,但是一般不这么叫)
  2. std::launch::deferred : 延迟调用 std::launch::async : 强制创建一个线程
  3. std::thread() 如果资源紧张,那么可能会创建线程失败,整个程序崩溃
  4. std::async和std::thread最明显的不同,就是async有时候并不创建新线程
  5. std::launch::async: 强制这个异步任务在新线程上执行,系统一定会创建出新线程来运行
二、std::thread 和 std::async的区别
  1. std::thread() 如果资源紧张,那么可能会创建线程失败,整个程序崩溃;如果用async就不会报异常不会崩溃,这种不加额外参数的调用就不会创建新线程,而是后续谁调用了result.get()来请求结果,那么这个异步任务就运行在执行这条get()语句所在 的线程上
  2. std::thread 创建线程的方式,如果线程返回值,想拿到值不容易(但是也可以通过将返回值赋值给全局变量;packed_task; promise等方式)
  3. std::async 创建异步任务,可能创建也可能不创建线程。并且async调用方法很容易拿到线程入口函数的返回值
  4. 如果你强制std::async一定要创建新线程,那么就必须使用std::launch::async作为第一个参数,承受的待久就是系统资源紧张是,程序崩溃

老司机提示:创建线程并不是越多越好,一般不建议超过100-200个

三、std::async(不加额外参数std::async(mythread))问题解决
  1. std::async ()不加额外参数,让系统自寻决定是否创建新线程
  2. 判断这个异步任务到底有没有被推迟执行 可以通过wait_for()来判断

int mythread()
{
	cout << "this thread id = " << this_thread::get_id() << endl;
	return 10;
}
int main()
{
	cout << "main thread id = " << this_thread::get_id() << endl;
	std::future<int> result = std::async(mythread);	//想判断async到底有没有创建新线程还是延迟没创建新线程

	std::future_status status = result.wait_for(0s);//(std::chrono::seconds(0));	//等待0秒
	if (status == std::future_status::deferred)
	{
		//线程被延迟执行了
		cout << result.get() << endl;	//这个时候才去调用mythread
	}
	else if (status == std::future_status::ready)
	{
		cout << "线程成功执行并返回" << endl;
		cout << result.get() << endl;
	
	}
	else
	{
	//表示线程还没执行完
		cout << "超时,线程还没有执行完毕" << endl;
	}

	cout << "程序运行完毕,退出" << endl;
    return 0;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值