C++异步操作实现线程池

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栖林_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值