std::shared_mutex学习

发布于:2025-02-11 ⋅ 阅读:(57) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到