news/2025/10/5 15:13:00/文章来源:https://www.cnblogs.com/TechLattice/p/19126607

目录
    • 1. 锁的分类
      • 1.1 自旋锁
      • 1.2 互斥锁
    • 手撕读写锁
      • 1. 读写锁的原理
      • 2. 读写锁的实现
        • 2.1 读写锁的接口设计
        • 2.2 读写锁的实现

1. 锁的分类

1.1 自旋锁

自旋锁是一种忙等待锁,当线程获取锁失败时,会一直循环等待,直到获取到锁为止。

自旋锁的优点是避免了线程切换的开销,缺点是如果锁竞争激烈,会导致CPU资源浪费。

1.2 互斥锁

互斥锁是一种阻塞锁,当线程获取锁失败时,会阻塞当前线程,直到获取到锁为止。

互斥锁的优点是可以保证线程安全,缺点是可能会导致线程阻塞,影响程序性能。

手撕读写锁

1. 读写锁的原理

读写锁,又称为共享-独占锁,是计算机程序的并发控制的一种同步机制,它允许多个线程同时读取共享数据,但是只允许一个线程写入共享数据,在写入共享数据时,会独占锁,其他线程不能读取也不能写入。

读写锁主要包含以下几个要点:

  • 读锁:允许多个线程同时获取读锁,但是不能获取写锁。
  • 写锁:只能有一个线程获取写锁,其他线程不能获取读锁和写锁。
  • 写锁优先级:当一个线程获取了写锁,其他线程不能获取读锁和写锁,直到写锁被释放。(推荐)
  • 读锁优先级:当一个线程获取了读锁,其他线程可以继续获取读锁,但是不能获取写锁,直到所有读锁被释放,需注意写饥饿问题。
  • 公平优先:读写锁是否公平,即获取锁的顺序是否按照请求的顺序。

读写锁的实现需要考虑以下几个问题:

  • 如何实现读锁和写锁的互斥?
    两个条件变量,一个用于读锁,一个用于写锁。
  • 如何实现读锁和写锁的优先级?
  • 如何实现读锁和写锁的同步?
    使用三个变量,一个记录活跃读者的数量,一个记录等待写者的数量,一个标记是否有活跃写者,只用等待写者数量无法准确判断是否有读者在写入。

2. 读写锁的实现

2.1 读写锁的接口设计

class Lock{
private:std::mutex mtx_;public:Lock(){};~Lock(){};void lock(){ mtx_.lock(); }void unlock(){ mtx_.unlock(); }std::mutex& getMutex(){ return &mtx_; }
};class RWLock {
public:RWLock();~RWLock();void readLock();void readUnlock();void writeLock();void writeUnlock();private:// 读写锁的成员变量Lock base_lock_;std::condition_variable read_cv_;std::condition_variable write_cv_;int active_readers_ = 0; // 活跃读者数量int waiting_writers_ = 0; // 等待写者数量bool active_writer_ = false; // 是否有活跃写者
};

2.2 读写锁的实现

RWLock::RWLock() {active_readers_ = 0;waiting_writers_ = 0;active_writer_ = false;
}RWLock::~RWLock() {active_readers_ = 0;waiting_writers_ = 0;active_writer_ = false;
}void RWLock::readLock() {std::unique_lock<std::mutex> lock(base_lock_.getMutex());// 如果没有活跃写者,并且没有等待的写者,则获取读锁read_cv_.wait(lock, [this]() {return !active_writer_ && waiting_writers_ == 0;});active_readers_++;
}
void RWLock::readUnlock() {std::unique_lock<std::mutex> lock(base_lock_.getMutex());active_readers_--;// 如果没有活跃读者,并且有等待的写者,则通知写者if (active_readers_ == 0 && waiting_writers_ > 0) {write_cv_.notify_one();}
}void RWLock::writeLock() {std::unique_lock<std::mutex> lock(base_lock_.getMutex());// 如果没有活跃读者,并且没有活跃写者,则获取写锁waiting_writers_++;write_cv_.wait(lock, [this]() {return !active_writer_ && active_readers_ == 0;});waiting_writers_--;active_writer_ = true;
}void RWLock::writeUnlock() {std::unique_lock<std::mutex> lock(base_lock_.getMutex());active_writer_ = false;// 如果有等待的写者,则通知写者if (waiting_writers_ > 0) {write_cv_.notify_one();}// 如果有等待的读者,则通知读者else if (active_readers_ > 0) {read_cv_.notify_all();}
}//RAII 写法
class ReadLock {
public:ReadLock(RWLock& rwlock) : rwlock_(rwlock) {rwlock_.readLock();}~ReadLock() {rwlock_.readUnlock();}// 禁用拷贝构造函数和赋值运算符ReadLock(const ReadLock&) = delete;ReadLock& operator=(const ReadLock&) = delete;private:RWLock& rwlock_;
};class WriteLock {
public:WriteLock(RWLock& rwlock) : rwlock_(rwlock) {rwlock_.writeLock();}~WriteLock() {rwlock_.writeUnlock();}// 禁用拷贝构造函数和赋值运算符WriteLock(const WriteLock&) = delete;WriteLock& operator=(const WriteLock&) = delete;private:RWLock& rwlock_;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1 洛谷题解修正器

写了个有意思的小工具

防止语言模型性能倒退的新方法

本文介绍了一种防止自然语言处理模型更新时出现性能倒退的新方法,通过知识蒸馏和约束优化来确保新模型在提升整体准确率的同时,不会在特定任务上出现性能衰退,涵盖了负翻转率测量和模型选择策略等技术细节。确保新版…

本站3天更换一次域名yw网络营销策划课程

BUFF,DEBUFF: 增益状态&#xff0c;包括自己或者队友施加的&#xff0c;例如骑士的祝福&#xff0c;牧师的耐力精神&#xff0c;小德的爪子DEBUFF就是减益状态&#xff0c;例如你PK的时候法师的寒冰箭减速&#xff0c;盗贼的毒药&#xff0c;SS的腐蚀等等NPC&#xff1a; NPC就…

南宁工程造价建设信息网站易企网站建设

源代码index.js里包含2部分① 业务逻辑代码 1mb② 引入&#xff08;如lodash包&#xff09;的代码 1mb若更新了业务逻辑代码&#xff0c;但在浏览器运行时每次都下载2mb的index.js显然不合理&#xff0c;第三方包是不会变的 手动拆分 webpack.base.js entry: {main: path.re…

RAG入门 - Retriever(1) - 指南

RAG入门 - Retriever(1) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&q…

毕业生就业推荐表模板网站开发制作网站的过程细节

什么是机器视觉 近年来&#xff0c;人工智能渐渐成为一个热点话题。作为人工智能领域的一个分支&#xff0c;图像处理技术也随之发展到了一个新的高度&#xff0c;各种新的软件工具、算法库、开源资料不断涌现&#xff0c;各行各业也渐渐开始进行技术变革。比较典型的例子是&a…

Delphi 解决IniFiles中文乱码

使用 AnsiToUtf8 方法转换一下就可以了procedure TForm1.LoadSettingsFromIni; varIniFile: TIniFile; beginIniFile := TIniFile.Create(FIniFilePath);tryUserNameEdit.Text := AnsiToUtf8((IniFile.ReadString(Sett…

180天做180个网站百度网盘官网网页版

最近朋友买了新手机&#xff0c;可是她又是电脑白痴&#xff0c;告诉她要她用百度搜&#xff0c;硬是没找到&#xff0c;百般无奈我千挑万选&#xff0c;找到了这个网站&#xff0c;让方便也同样带给同样不知道怎么用百度的朋友了5230主题下载网址&#xff1a;http://d.958shop…

礼泉做网站网站设计师主要做什么的

为 IoT 而生的鸿蒙操作系统&#xff0c;其优势与特点几乎都是围绕「万物互联」展开的。在曝光两年之后&#xff0c;华为的鸿蒙系统终于正式和用户见面了。6 月 2 日&#xff0c;华为鸿蒙操作系统及华为全场景新品发布会开启&#xff0c;正式推出 HarmonyOS 2.0&#xff0c;并发…

网站的域名空间网站的设计公司

讲正文之前&#xff0c;推荐一个连接&#xff1a;http://wuxinaiaman928.blog.163.com/blog/static/64932144200811911233198/ 里面比较详细的介绍了Vmware中三种不同的连接方式&#xff1a;桥连接&#xff0c;NAT&#xff0c;使用主机网络&#xff0c;有助于理解简单来讲&…

Web前端为什么要打包?Webpack 和 Vite 如何助力现代开发? - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

常州网站关键词优化软件建站系统是什么

作为一个程序员&#xff0c;选择职业赛道就像是在一座迷宫中探索前端的美丽花园&#xff0c;后端的黑暗洞穴&#xff0c;还有数据科学的神秘密室。每一条赛道都充满了挑战和机遇&#xff0c;而选择哪一条赛道将直接影响到你未来的职业发展和成就。对于每一位准备投身或已经在编…

淄博网站制作托管优化师德师风建设网站

参考链接 Cplus plus参考链接numeric_limits<double>::max ()是函数&#xff0c;返回编译器允许的 double 型数 最大值。类似的 numeric_limits<int>::max () 返回 编译器允许的 int 型数 最大值。需包含头文件 #include <limits> imits是STL提供的头文件&…

在哪做网站关键词官方网站下载打印机的驱动

研究经济学的理由就是【为了避免被经济学家欺骗】——琼罗宾逊 以前看见过一句话&#xff1a;大学生的钱是最好赚的。为什么&#xff1f;因为大学生要面子、没有经历过赚钱的心酸以及思想单纯容易被骗。最近一件事情让我感触很深&#xff0c;前几天室友将学校的水果店给投诉了…

分布式微服务系统架构第142集:全栈构建

分布式微服务系统架构第142集:全栈构建pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

2025 年电永磁吊具制造厂家 TOP 企业品牌推荐排行榜全新发布,含大型电永磁吊具,全覆盖,起重,小型,钢板,钢板电永磁吊具公司推荐!

当前工业生产中,电永磁吊具作为物料搬运的核心设备,其性能直接影响生产效率与作业安全。但市场现状却不容乐观,一方面,大量小型厂商缺乏核心技术,生产的吊具常出现吸力不足、能耗超标、故障频发等问题,不仅拖慢生…

实用指南:云原生时代 Kafka 深度实践:03进阶特性与最佳实践

实用指南:云原生时代 Kafka 深度实践:03进阶特性与最佳实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

MySQL——事务 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …