std::future
std::future是C++11标准库中的一个模板类,表示异步操作的结果
当我们在进行多线程中使用异步任务时,std::future是用来帮我们在需要的时候获取任务执行的结果
他的一个重要的特性就是能够阻塞当前的线程,一直到异步操作完成,从而确保在获取结果的时候,异步工作线程的任务是完成的
主要应用场景就是异步任务,比如说网络请求或者计算密集型任务;并发控制,在多线程编程中,我们需要等待某些任务完成之后才能继续执行其他操作,实现线程同步;最后就是可以通过std::future::get()来获取任务的结果
用法
async函数
#include <iostream>
#include <thread>
#include <future>
#include "../logs/Xulog.h"
int Add(int num1, int num2)
{
INFO("正在计算...");
return num1 + num2;
}
int main()
{
// std::async(func, ...)
// std::async(policy, func, ...)
INFO("异步任务执行");
std::future<int> res = std::async(std::launch::deferred, Add, 114, 514);
INFO("获取结果");
int sum = res.get();
INFO("结果是%d", sum);
return 0;
}
[24-10-02|16:04:34][139769238738752][root][Async.cc:16][INFO] 异步任务执行
[24-10-02|16:04:34][139769238738752][root][Async.cc:18][INFO] 获取结果
[24-10-02|16:04:34][139769238738752][root][Async.cc:8][INFO] 正在计算...
[24-10-02|16:04:34][139769238738752][root][Async.cc:20][INFO] 结果是628
在我们调用获取结果之后,才显示正在计算,执行异步任务,
这个std::launch::deferred
其实就是设置,在获取结果时,才会进行传参调用,deferred本身是推迟的意思
与之对应的就是std::launch::async
,是如果有结果的话,直接获取结果,没有的话也是会阻塞等待
promise::get_future
这是一个模板类
主要是用来返回future对象,会和future共享一个同步状态
使用样例
#include <iostream>
#include <thread>
#include <future>
#include <chrono>
#include "../logs/Xulog.h"
void Add(int num1, int num2, std::promise<int> &prom)
{
INFO("正在计算...");
prom.set_value(num1+num2);
}