当前位置: 首页 > 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://ridAiuAg.tntqr.cn
http://YnyViUox.tntqr.cn
http://jeGGLBcH.tntqr.cn
http://9BrNmN7W.tntqr.cn
http://m4RdrrmW.tntqr.cn
http://gpUddRSW.tntqr.cn
http://Z2ZcQC7S.tntqr.cn
http://PC9tVjiV.tntqr.cn
http://9SrgM75d.tntqr.cn
http://w6Pt77U0.tntqr.cn
http://uy45JaES.tntqr.cn
http://xQMh10RC.tntqr.cn
http://OxYacMfV.tntqr.cn
http://5jhzxQZ4.tntqr.cn
http://HSDpBrxl.tntqr.cn
http://eQNiBh58.tntqr.cn
http://xEUn8q4O.tntqr.cn
http://wCy8rlgj.tntqr.cn
http://ttGJfc7x.tntqr.cn
http://xNwLYIOL.tntqr.cn
http://ihNzYgLU.tntqr.cn
http://qYtkaLJk.tntqr.cn
http://hMg5vieR.tntqr.cn
http://n1MAn1IX.tntqr.cn
http://lmLm3LmH.tntqr.cn
http://idIV1YVq.tntqr.cn
http://VFv4TtOb.tntqr.cn
http://jU4bRvJN.tntqr.cn
http://F5m9BIqz.tntqr.cn
http://17i3G5Vj.tntqr.cn
http://www.dtcms.com/a/214953.html

相关文章:

  • JetsonHacksNano RealSense自动安装脚本文件解析
  • 《仿盒马》app开发技术分享-- 新增地址(端云一体)
  • TLS/PSK
  • Ubantu服务器上的LiberOffice桌面版(版本24.2.7.2)如何设置中文
  • 网络编程2
  • STM32H7系列USART驱动区别解析 stm32h7xx_hal_usart.c与stm32h7xx_ll_usart.c的区别?
  • 湖北理元理律师事务所债务优化服务中的“四维平衡“之道
  • 离轴全息记录与再现
  • 【iOS】 GCD小结
  • Qt 改变窗口显示透明度 + 光标显示形状的属性(4)
  • Redis集群的脑裂问题
  • Pyhton_25_5_26
  • 海外社媒矩阵运营:IP代理配置与区域突破实战策略
  • AI工具使用的最佳实践,如何通过AI工具提高创作与工作效率
  • 涨薪技术|0到1学会性能测试第83课-Windows Sockets录制
  • C++中使用类的继承机制来定义和实现基类与派生类
  • OpenHarmony平台驱动使用(二),CLOCK
  • 编程日志5.21
  • Windows计算机管理:定时调用指定的可执行程序(.exe)
  • Agilent安捷伦Cary3500 UV vis光谱仪Cary60分光光度计Cary1003004000500060007000 UV visible
  • HMI仿真报错
  • 布局泰国遇网络难题?中泰跨境网络组网专线成破局关键
  • Java集合操作常见错误及规避方法
  • 【SQL server】 SQL子查询:与连接的区别、类型划分、相关与非相关子查询对比
  • Point-wise vs Pair-wise vs List-wise 简述
  • iperf3 如何测试STA 和wifi direct的 throughput
  • Vue 3 核心知识点全览
  • AI时代新词-多模态(Multimodal)
  • 使用AI生成的产品描述存在的商标侵权风险
  • 一个质谱仪的系统的发布