golang的互斥锁和读写锁

news/2024/12/19 21:09:17/文章来源:https://www.cnblogs.com/kezhang2gopher/p/18617800

golang mutex(互斥锁)

1.锁最本质的作用
保证原子性
2.mutex 使用原则
适用于并发编程,尽量减少加锁区域的逻辑
3.mutex的局限性
仅限于单个进程内操作

sema(信号量,semaphore的简称)是一种用于并发控制的机制
资源计数:信号量维护一个资源计数。这个计数表示当前可用的资源数量

获取操作(P操作):当一个协程(goroutine)想要获取资源时,会检查信号量的资源计数,如果计数大于0,说明有可用资源,协程可以获取资源,同时信号量的计数减1;如果计数为0,表示没有可用资源,协程就会阻塞等待,直到有其他协程释放资源

释放操作(V操作):当一个协程使用完资源后,会释放资源。这会使信号量的计数加1,如果有协程正在等待这个资源,那么其中一个等待的协程会被唤醒并获取到资源

锁分快慢两种获取路径

互斥锁可以处于两种操作模式:正常模式和饥饿模式
在正常模式下,等待者按照先进先出(FIFO)的顺序排队,但是被唤醒的等待者并不拥有互斥锁,并且要与新到达的协程竞争互斥锁的所有权。
新到达的协程具有优势--它们已经在CPU 上运行,而且可能教量众多,所以被唤醒的等待者很有可能竞争失败,在这种情况下,它会被排到等待队列的前端,如果一个等待者超过1毫秒未能获取到互斥锁,它就会将互斥锁切换到饥饿模式。

在饥饿模式下,互斥锁的所有权直接从解锁的协程传递给队列前端的等待者。新到达的协程即使看到互斥锁似乎未被锁定也不会尝试获取,也不会尝试空转(自旋),相反,它们会将自己排到等待队列的末尾。
如果一个等待者获得了互斥锁并且发现:
(1)它是队列中的最后一个等待者
(2)它的等待时间少于1毫秒
它就会将互斥锁切换回正常操作模式。

golang RMmutex(读写锁)

1.读写锁与互斥锁的区别
互斥锁:同一时间只允许持锁的协程访问被保护的资源,不论读写
读写锁:在互斥锁的基础上进行了优化,将操作分为读操作和写操作,允许多个协程同时进行读操作。但写操作必须独占访问,从而提高读多写少场景下的并发性能

2.读写锁的应用场景
读多写少的应用场景,比如:缓存,配置等操作

3.读写锁的底层实现

type RWMutex struct {w           Mutex  // held if there are pending writerswriterSem   uint32 // 用于writer等待读完成排队的信号量readerSem   uint32 // 用于reader等待写完成排队的信号量readerCount int32  // 读锁的计数器readerWait  int32  // 等待读锁释放的数量
}

参考:https://blog.csdn.net/qq_41035588/article/details/108633171

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

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

相关文章

「测试人员」年终总结及来年规划

年底一般企业都会针对项目写总结,一般流程是组员呈交给组长,组长递交给测试经理,所以每个层级写各自的总结,会有不同的侧重点。 今天分别来聊聊测试工程师、测试组长以及测试经理年终总结的关注点在什么地方以及采用什么样的方法及策略使年终总结有实际意义且高大上。📝 …

【硬件测试】基于FPGA的2FSK调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR

1.算法仿真效果 本文是之前写的文章基于FPGA的2FSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR_fpga 2fsk-CSDN博客的硬件测试版本。在系统在仿真版本基础上增加了ila在线数据采集模块,vio在线SNR设置模块,数据源模块。硬件ila测试结果如下:(…

征程 6 云端 Ota 升级方案设计与实现

01 引言 在开发、调测过程中,经常通过 Ota 技术升级应用软件、底软。目前,项目上已将 Matrix6 的 Demo 部署在实车上,每次软件、底软需要版本更替或版本升级时,都需要研发测试同学上到车上使用工控机进行手动升级。 这流程存在耗费人力多,花费时间长,流程易出错的问题,并…

vxe-table 树表格新增数据,插入指定节点位置操作

vxe-table 新增数据,插入指定节点位置操作 官网:https://vxetable.cn npm install vxe-pc-ui@4.3.37 vxe-table@4.9.31// ... import VxeUI from vxe-pc-ui import vxe-pc-ui/lib/style.css import VxeUITable from vxe-table import vxe-table/lib/style.css // ...createAp…

less5

1.在URL处输入 ?id=1 ?id=1 ?id=1" ?id=1/1发现回显只有you are in......和报错 报错:判断回显是布尔类型 使用order by发现回显有三栏 ?id=1 order by 4%23 ?id=1 order by 1%23 ?id=1 order by 3%23判断数据库长度:8位 ?id=1 and length((select database()))&g…

Java-递归查询部门下所有子部门(包括本部门)

Java-递归查询部门下所有子部门(包括本部门),会得到一个部门id的集合:List deptIds具体代码如下: //递归1public List<Long> queryAllSubInstitutionIds(Long institutionId) {List<Long> subInstitutionIds = new ArrayList<>();querySubInstitutionIds…

生物医学信息

生物信息学基础 生物医学信息学的概念的掌握生物信息学很大一部分工作体现在生物数据的收集、存储、管理与提供 利用多组学数据(基因组,转录组,表观遗传组、蛋白组等)和机器学习、数据挖掘的方法 ,挖掘潜在的生物学、医学的知识和模式,用于解决诊断和治疗。中心法则是什么…

5、导出表

5、导出表 typedef struct _IMAGE_EXPORT_DIRECTORY {DWORD Characteristics;DWORD TimeDateStamp;WORD MajorVersion;WORD MinorVersion;DWORD Name; // 指向 导出表的文件名DWORD Base; // 导出函数的起始序号DWORD NumberOfFunctions; // 所有导…

4、文件与内存转换相关

4、文件与内存转换相关 FileBufferToImageBuffer 也是一样的长话短说。这里涉及了一点,就是内存对齐 PE头与节区之间 节区与节区时间会发生内存对齐。在文件中有一个文件对齐 ​​ 在可选PE头中有这两个进行标识,之前也写过这个内存对齐的博客,这里就不多说了 下面贴几个代…

1、PE 初识

1、PE 初识 概论 首先 PE头部分主要是学习PE结构的前半部分,每一个是做什么的,以及重点是什么,每一个是做什么用的。并使用Cpp代码来解析该PE头 注意这里用了一个Windows.h的头文件,后面再说。 PE是Windows系统 PE结构(Portable Executable),即可移植可执行文件格式,是…

交换空间swap

交换空间: 交换空间是硬盘上的一部分,被用作虚拟内存,当系统的物理内存(RAM)不足时,系统会使用交换空间来存储暂时不用的数据。1.关闭交换空间 1)关闭所有交换空间 swapoff -a2)关闭特定的交换空间 swapoff /dev/sdb12.开启交换空间 1)开启所有交换空间 swapon -a2…

2024 IDEA 2024.3 安装使用教程(附激活至2099年,以及常见问题处理)

IntelliJ IDEA简介 IntelliJ IDEA是一款非常强大的Java集成开发环境(IDE),由JetBrains公司开发。它提供了丰富的功能和工具,帮助开发者更高效地编写、调试和部署代码。 下面这种方式仅供交流学习,如果有能力还请支持正版 下载安装 下载 IDEA 2024.3 版本的安装包 为了方便,也…