C++11并发与多线程笔记(9) async、future、packaged_task、promise

第九节、async、future、packaged_task、promise

在这里插入图片描述

本节内容需要包含头文件#include <future>

一、std::async、std::future创建后台任务并返回值
std::async是一个函数模板,用来启动一个异步任务,启动起来一个异步任务之后,它返回一个std::future对象,这个对象是个类模板。

什么叫“启动一个异步任务”?就是自动创建一个线程,并开始 执行对应的线程入口函数,它返回一个std::future对象,这个std::future对象中就含有线程入口函数所返回的结果,我们可以通过调用future对象的成员函数get()来获取结果。

“future”将来的意思,也有人称呼std::future提供了一种访问异步操作结果的机制,就是说这个结果你可能没办法马上拿到,但是在不久的将来,这个线程执行完毕的时候,你就能够拿到结果了,所以,大家这么理解:future中保存着一个值,这个值是在将来的某个时刻能够拿到。

std::future对象的get()成员函数会等待线程执行结束并返回结果,拿不到结果它就会一直等待,感觉有点像join()。但是,它是可以获取结果的。

std::future对象的wait()成员函数,用于等待线程返回,本身并不返回结果,这个效果和 std::thread 的join()更像。

#include <iostream>
#include <future>
using namespace std;
class A {
   
public:
	int mythread(int mypar) {
   
		cout << mypar << endl;
		return mypar;
	}
};
 
 
int mythread() {
   
	cout << "mythread() start" << "threadid = " << std::this_thread::get_id() << endl;
	std::chrono::milliseconds dura(5000);
	std::this_thread::sleep_for(dura);
	cout << "mythread() end" << "threadid = " << std::this_thread::get_id() << endl;
	return 5;
}
 
 
int main() {
   
	A a;
	int tmp = 12;
	cout << "main" << "threadid = " << std::this_thread::get_id() << endl;
	std::future<int> result1 = std::async(mythread);
	cout << "continue........" << endl;
	cout << result1.get() << endl; //卡在这里等待mythread()执行完毕,拿到结果
	
	//类成员函数
	std::future<int> result2 = std::async(&A::mythread, &a, tmp); //第二个参数是对象引用才能保证线程里执行的是同一个对象
	cout << result2.get() << endl;
   //或者result2.wait();
	cout << "good luck"
  • 16
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
C++中,可以使用std::thread来创建多线程,使用std::async来异步执行任务。因此可以利用这两个工具来实现多线程多线程的功能。 具体来说,可以在一个线程中创建多个std::thread对象,每个std::thread对象都可以执行一个任务。每个任务本身也可以是一个多线程的程序,这样就完成了多线程多线程的功能。 例如,可以使用如下代码来创建多线程: ``` #include <iostream> #include <thread> #include <future> #include <vector> void task(int tid) { std::cout << "Thread " << tid << " started." << std::endl; // 这里可以编写多线程程序的代码 } int main() { std::vector<std::thread> threads; for (int i = 0; i < 10; i++) { std::thread t(task, i); threads.push_back(std::move(t)); } for (auto& t : threads) { t.join(); } return 0; } ``` 上述代码中创建了10个线程,每个线程执行一个任务。每个任务都是一个函数,可以在其中编写多线程程序的代码。 同时,也可以使用std::async来异步执行任务,示例代码如下: ``` #include <iostream> #include <future> #include <vector> void task(int tid) { std::cout << "Thread " << tid << " started." << std::endl; // 这里可以编写多线程程序的代码 } int main() { std::vector<std::future<void>> futures; for (int i = 0; i < 10; i++) { std::future<void> f = std::async(std::launch::async, task, i); futures.push_back(std::move(f)); } for (auto& f : futures) { f.get(); } return 0; } ``` 上述代码中使用了std::async来异步执行任务,返回的std::future对象可以用来获取任务执行的结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值