当前位置: 首页 > article >正文

std::shared_mutex学习

1、概述

std::shared_mutex是C++17引入的互斥锁,允许多个读线程持有锁(共享所有权),或者允许单个写线程独占锁(独占所有权)。适合于多个线程并发的读取资源,但当有线程需要写入时,则不允许其他任何线程(包括读和写)访问资源。

使用std::shared_mutex通常与俩个锁原语一起使用:

1、std::shared_lock:提供对std::shared_mutex的共享所有权。std::shared_lock<std::shared_mutex> ReadLock; // 读锁

2、std::unique_lock:提供对std::shared_mutex的独占所有权

std::unique_lock<std::shared_mutex> WriteLock; // 写锁

官网介绍:https://en.cppreference.com/w/cpp/thread/shared_mutex

2、代码解析

我们分别使用写锁和读锁运行下程序,感受下他们的区别,应该就会清晰很多。

1、使用写锁场景
此时使用的是写锁,相当于互斥锁,同一时间只能有一个线程访问资源,所以控制台的打印是整整齐齐,按顺序打印。

2、使用读锁场景

此时使用的是读锁,允许多个线程读,所以有并发线程同时运行,所以控制台打印出现混乱。

3、代码

#include "pch.h"
#include <iostream>
#include <thread>
#include <vector>
#include <shared_mutex>

class SharedData {
public:
    void read_data(int id) {
        //std::unique_lock<std::shared_mutex> lock(mutex_); // 独占锁
        std::shared_lock<std::shared_mutex> lock(mutex_); // 共享锁
        // 模拟读操作
        std::cout << "Reader " << id << " is reading.\n";
    }

//     void write_data(int id) {
//         std::unique_lock<std::shared_mutex> lock(mutex_); // 独占锁
//         // 模拟写操作
//         std::cout << "Writer " << id << " is writing.\n";
//     }

private:
    std::shared_mutex mutex_;
};

int main() {
    SharedData data;
    std::vector<std::thread> threads;

    // 创建多个读线程
    for (int i = 0; i < 5; ++i) {
        threads.emplace_back([&data, i]() { data.read_data(i); });
    }

    // 创建一个写线程
    //threads.emplace_back([&data]() { data.write_data(1); });

    // 等待所有线程完成
    for (auto& th : threads) {
        th.join();
    }

    return 0;
}

学习链接:https://github.com/0voice


http://www.kler.cn/a/464409.html

相关文章:

  • 三甲医院等级评审八维数据分析应用(五)--数据集成与共享篇
  • QML自定义进度条和单选按钮的样式
  • 性能测试03|JMeter:断言、关联、web脚本录制
  • Oracle ASM命令行工具asmcmd命令及其使用方法
  • 38 Opencv HOG特征检测
  • QQ长截屏
  • 二叉树遍历:C++ 实现指南
  • Python的*args和**kwargs
  • Word如何插入图片并移动到某个位置
  • 173. 矩阵距离 acwing -多路BFS
  • 【 IEEE 独立出版 · EI核心、Scopus稳定检索 】第二届算法、软件工程与网络安全国际学术会议(ASENS 2025)
  • Hive集成Iceberg碰到的问题
  • Bash 中的 2>1 | tee 命令详解
  • java实现预览服务器文件,不进行下载,并增加水印效果
  • 《Vue3实战教程》37:Vue3生产部署
  • 【SpringBoot教程】搭建SpringBoot项目之编写pom.xml
  • 《Java 数据结构》
  • spring-boot启动源码分析(二)之SpringApplicationRunListener
  • redis的学习(一)
  • 【人工智能机器学习基础篇】——深入详解无监督学习之聚类,理解K-Means、层次聚类、数据分组和分类
  • Flutter:邀请海报,Widget转图片,保存相册
  • 快递物流查询API接口推荐
  • 操作018:Stream Queue
  • 【2025优质学术推荐】征稿控制科学、仪器、智能系统、通信、计算机、电子信息、人工智能、大数据、机器学习、软件工程、网络安全方向
  • Leetcode打卡:分割数组
  • 使用 Python结合ffmpeg 实现单线程和多线程推流