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