async和package_task和promise

本文介绍了C++中用于异步编程的`async`、`package_task`和`promise`。`async`启动异步任务并返回结果对象,`wait`和`get`用于获取结果,`defer`参数表示任务延迟执行。`package_task`用于包装可调用对象,方便线程管理。`promise`类使得值能在不同线程间传递。更多内容可在作者个人网站查阅。
摘要由CSDN通过智能技术生成

一、std::asyncstd::future

  • std::async是一个函数模板,用来启动一个异步任务,它返回一个std::future对象,这个对象是个类模板。
  • 这个std::future对象中就含有线程入口函数所返回的结果,我们可以通过调用future对象的成员函数get()来获取结果。

二、std::futureget()wait():

  • get()成员函数会等待线程执行结束 返回结果,拿不到结果它就会一直等待。
  • get()只能调用一次。
  • std::future对象的wait()成员函数,用于等待线程返回 并不返回结果.

实例:(需要加上头文件 #include<future>)

int myThread()
{
   
	cout << "myThread()  START..." << "   thread_id:" << std::this_thread::get_id() << endl;
	Sleep(5000);
	cout << "myThread()  END..." << "   thread_id:" << std::this_thread::get_id() << endl;
	return 5;
}

int main()
{
   
	cout << "main:" << "   thread_id:" << std::this_thread::get_id() << endl;
	std::future<int>result = std::async(myThread);//创建线程并开始执行	
	cout << "continue..." << endl;

	//result.wait();
	cout << result.get() << endl;

	cout << "------ end -----" << endl;
	return 0;
}

2.1、std::lunch::deferred

并没有创建新线程,在主线程运行子线程内容

  • (defer推迟,延期)表示线程入口函数的调用会被延迟,一直到std::futurewait()或者get()函数被调用时(由主线程调用)才会执行;如果wait()或者get()没有被调用,则不会执行。若主线中没有wait()或者get()出现,则新线程根本未被创建。
std::future<int>result = std::async(std::launch::deferred
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值