异步
异步编程是一种程序设计范式,允许任务在等待耗时操作(如I/O、网络请求)时暂停执行,转而处理其他任务,待操作完成后自动恢复。其核心目标是避免阻塞主线程,提升程序的并发性和响应速度。
简单来说:就是不阻塞当前主线程,创建子线程,交给子线程操作
但是线程之前的数据通信较为麻烦所以有了以上操作函数和类
1.async
future类的作用是保存异步操作的结果,从而实现线程间的数据交换
deferred是同步,async是异步
aysnc(deferred/async, 函数名,参数);
#include<iostream>
#include<future>
#include<thread>
#include<chrono>
int add(int a,int b)
{
std::cout<<"add "<<std::endl;
return a+b;
}
int main()
{
std::future<int> res =std::async(std::launch::async,add,10,11);
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout<<"---------------------"<<std::endl;
std::cout<<"result: "<<res.get()<<std::endl;
return 0;
}
执行结果:可以看到先执行了函数里的内容,没有因为主线程的sleep导致运行暂停
2.package_task
可以看到package_task相当于是对async进行了任务封装,
对于一个函数可以方便的重复调用
#include<iostream>
#include<future>
#include<thread>
#include<memory>
#include<chrono>
int add(int a,int b)
{
std::cout<<"add "<<std::endl;
return a+b;
}
int main()
{
auto task= std::make_shared<std::packaged_task<int(int,int)>>(add);
std::future<int> ret=task->get_future();
std::thread thr([&task](){
(*task)(11,12);
});
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout<<"-------------"<<std::endl;
std::cout<<"result: "<<ret.get()<<std::endl;;
thr.join();
return 0;
}
也是进行了一次异步操作
3.promise
对运行结果进行封装,在运行函数中将结果设置到promise中
#include <iostream>
#include <future>
#include <thread>
#include <memory>
#include <chrono>
int add(int a, int b)
{
std::cout << "add " << std::endl;
return a + b;
}
void task(std::promise<int> &prm)
{
int ret = add(12, 3);
std::this_thread::sleep_for(std::chrono::seconds(1));
prm.set_value(ret);
}
int main()
{
std::promise<int> prm;
std::future<int> res = prm.get_future();
std::thread thr([&prm]()
{ task(prm); });
int ret = res.get();
std::cout << "result: " << ret << '\n';
thr.join();
return 0;
}
运行结果