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

高并发系统下Mutex锁、读写锁、线程重入锁的使用思考

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

首先是这几种锁的不同与介绍:Mutex锁、读写锁、线程可重入锁。

Mutex读锁

Mutex锁,有加锁状态、未加锁两种状态;
[未加锁状态]时,任一线程申请锁后,该锁进入[加锁状态];
[加锁状态]时,进程内的所有线程再申请锁时均需要等待,需要等该锁释放后,才能再申请到锁;
在这里插入图片描述

RWLock读写锁

ReadWriteMutex读写锁,有加写锁状态、加读锁状态、未加锁三种状态;
[未加锁状态]时,任一线程申请读锁后,该锁进入[加读锁状态];
[未加锁状态]时,任一线程申请写锁后,该锁进入[加写锁状态];
[加读锁状态]时,任一线程申请读锁时,申请返回成功,该锁锁状态不变;
[加读锁状态]时,任一线程申请写锁时,申请等待,需要等该读锁释放后,才能申请到写锁;
[加写锁状态]时,任一线程申请读锁时,申请等待,需要等该读锁释放后,才能申请到读锁;
[加写锁状态]时,任一线程申请写锁时,申请等待,需要等该读锁释放后,才能再申请到写锁;
在这里插入图片描述

ThreadMutex重入线程锁

ThreadMutex锁,有加锁状态、未加锁两种状态;
[未加锁状态]时,任一线程申请锁后,该锁进入[加锁状态];
[加锁状态]时,该申请到锁的线程下,再次申请该锁时,申请返回成功,该锁锁状态不变;
[加锁状态]时,非该申请到锁的线程,申请加锁时,申请等待,需要等该线程锁释放后,才能再申请到锁;
在这里插入图片描述

使用问题

无论Mutex锁,还是读写锁,还是线程锁。
都存在着,当某个状态加锁时,另一个处申请该锁需要等待的情况,
例如Mutex的加锁情况;
例如读写锁的写锁状态时,或者读取状态申请写锁时;
例如线程锁的其它线程申请锁状态时;
只要存在等待另一个锁释放,那么一旦在某些情况下,该锁占用的周期长了,其它hang住的时间就会长,这个对于高并发系统来说就不容易忍受的。

如何设计高并发系统的锁

怎么设计高并发系统呢?
对于使用锁的情况,我觉得核心点还是,快进快出,申请锁可以,快速用完快速归还;
不要持有锁过长;
不要在持有锁的时候做耗时长的事情;
不要在持有锁的时候做IO操作,无论少量还是大量;
不要在持有锁的时候做大量的计算操作;
不要在持有锁的时候做大量的内存申请释放操作;

如果需要计数,可以直接用std::atomic,快进快出,就一个变量的加锁时间,符合上面的要求;
如果需要唯一进入条件的话,也可以用bool型的std::atomic::compare_exchange_strong,来做唯一进入某个处理的限定;
这些方法都是用轻量级的快进快出加锁解锁的atomic来替代不可预期加锁时长的mutex。

所以总体来看,让加锁快进快出,是高并发系统加锁设计的核心。
当然了,如果可以通过数据结构,设计出无锁设计,那也是相当好的,“无招胜有招”。

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

http://www.xdnf.cn/news/659773.html

相关文章:

  • 区块链DApp的开发技术方案
  • 04_redis之ZSet使用实例-积分榜
  • 如何提高 Python 代码质量
  • 数据安全与纵深访问控制:构建数字时代的安全防线
  • 三、Docker目录挂载、卷映射、网络
  • 量子-经典协同计算新路径:NISQ 时代混合算法对后量子密码学的适应性探索
  • Linux系统编程-DAY05
  • 华为OD机试真题——最长的顺子(2025B卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • SOC-ESP32S3部分:14-错误处理
  • 【教学类-36-09】20250526动物面具描边(通义万相)对称图40张,根据图片长宽,自动旋转图片,最大化图片
  • vue3组合API-toRefs函数
  • Python 训练营打卡 Day 36
  • A2A协议(Agent-to-agent Protocol)学习
  • CentOS中安装Docker Compose
  • 【面试题】如何测试一个新增的服务端接口?
  • CSS闯关指南:从手写地狱到“类”积木之旅|得物技术
  • 嵌入式开发学习日志(linux系统编程--进程(2))Day28
  • TLS/PSK
  • vue3减少打包体积
  • C++:多重继承
  • 蓝桥杯b组c++赛道---数位dp
  • git 新建一个分支,怎么首次推到远程仓库
  • 计算机图形学:(四)欧拉角与四元数
  • 尚硅谷redis7 37 redis持久化之AOF简介
  • Unity---OSC(Open Sound Control)、TouchOSC Editor、创建布局
  • Java高频面试之并发编程-21
  • Linux `hostname` 命令深度解析与高阶应用指南
  • Linux中的SELinux
  • RPM之(1)基础使用
  • 【2025】嵌入式软考中级部分试题