c++异步std::future,多线程

本文介绍了一个C++程序,展示了如何使用线程、互斥量(mutex)和future来并发地加载数据到映射中,确保数据同步。main函数中创建了10个异步任务,每个任务调用load_thread函数并将结果存储在共享map中。
摘要由CSDN通过智能技术生成
#include <thread>
#include <mutex>
#include <future>

// 定义一个函数,用于线程加载数据
void load_thread(int num, std::mutex& mtx, std::map<int, string>& res)
{
    // 将整数转换为字符串,并添加下划线v
    std::string value = std::to_string(num).append("_v");
    // 输出当前线程的编号和正在加载的数据
    std::cout << "Thread " << num << " is loading " << value << std::endl;
    // 锁住res
    std::unique_lock<std::mutex> lock(mtx);  
    // 将数据添加到res中
    res[num] = value;
    // 解锁
    lock.unlock();

}

int main()
{
    // 定义一个map,用于存储结果
    std::map<int, string> result;
    // 定义一个vector,用于存储异步任务
    std::vector<std::future<void>> futures;
    // 锁住result
    std::mutex mtx;
    // 循环10次
    for (int i = 0; i < 10; i++)
    {
        // 异步
        // std::async 函数用于创建一个异步任务。
        // std::launch::async 是一个属性,表示异步任务应该在后台线程中运行。
        // load_thread 要运行的函数,五个参数:整数 num,std::mutex& mtx,std::map<int, string>& res。
        // std::ref(mtx) 和 std::ref(result) 分别表示对 mtx 和 result 的引用,这样在 load_thread 函数中可以直接修改这些变量的值,而无需使用指针。
        futures.emplace_back(std::async(std::launch::async, load_thread, i, std::ref(mtx), std::ref(result)));
    }
    // 等待每个线程读取完
    for (auto& future : futures)
    {
        future.wait();
    }

    for(const auto&[key, value] : result)
    {
        std::cout << key << " " << value << std::endl;
    }
    return 0;

}
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值