问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

golang 系列: mutex 讲解

发布网友 发布时间:2024-09-29 03:28

我来回答

1个回答

热心网友 时间:2024-10-01 22:22

Go语言设计初衷便是为了高并发场景,因此在资源竞争的场景下,使用mutex的Lock()和Unlock()方法来管理公共资源成为关键。虽然方法调用简单,但其内部机制却较为复杂。让我们深入剖析mutex的运作原理。

mutex的源代码位于src/sync/mutex.go文件,其结构简洁,关键在于信号量标记位sema。信号量机制用于管理goroutine之间的阻塞与唤醒。理解信号量与PV原语操作有助于我们更好地掌握mutex的功能。

PV原语解释了信号量S的用途:当S>0时,表示有S个资源可用;S=0时,表示无资源可用;S<0时,其绝对值表示等待队列中的进程数量。S的初始值应大于等于0。P操作是请求资源,原子性地将S减1,若减1后S仍大于等于0,则继续执行;若减1后S<0,则进程被阻塞并加入等待队列。V操作是释放资源,原子性地将S加1,若加1后S仍大于0,则继续执行;若加1后S≤0,则唤醒等待队列中的进程。

mutex通过信号量实现了goroutine的阻塞与唤醒,其本质上是关于信号量的阻塞唤起操作。当goroutine无法获取锁资源时会被挂起阻塞,无法执行后续代码逻辑。当mutex释放锁资源时,会唤醒之前阻塞的goroutine以抢占锁资源。

mutex的状态标志位由32位组成,其中低3位分别表示唤醒状态、上锁状态和饥饿状态,剩余位表示当前阻塞等待的goroutine数量。mutex根据state状态进入正常模式、饥饿模式或自旋模式。

在正常模式下,当调用Unlock()方法释放锁资源时,如果发现等待唤起的goroutine队列,会唤醒队头的goroutine。队头的goroutine被唤醒后,尝试使用CAS方法修改state状态,成功则表示成功获取锁资源。

饥饿模式发生在队头goroutine无法在一定时间内获取锁资源,且有新来的goroutine尝试获取资源的情况下。在这种情况下,Go会直接将锁资源交给队头goroutine,并将当前状态改为饥饿模式。后面的新来goroutine会直接添加到等待队列的队尾。

当锁资源长时间被占用时,为了减少阻塞唤起goroutine的开销,mutex会让当前的goroutine空转CPU,直到不满足自旋条件,最终加入等待队列。自旋条件需满足特定要求,以避免不必要的CPU消耗。

mutex的Lock()过程如下:如果m.state=0,即没有goroutine占有资源,也不需要阻塞等待唤起的goroutine。尝试使用CAS方法占有锁资源,不执行其他操作。若不满足m.state=0,进一步判断是否需要自旋。如果不需要自旋或自旋后仍无法获取资源,则调用runtime_SemacquireMutex函数阻塞当前goroutine并加入等待队列。当锁资源释放,mutex唤醒队头的goroutine后,队头goroutine尝试占有锁资源,此时可能与其他新来的goroutine竞争。当队头goroutine长时间无法获取资源时,进入饥饿模式,直接将锁资源交给队头goroutine,让新来的goroutine阻塞并加入等待队列的队尾。

Unlock过程相对简单,只需检查是否存在等待唤起的goroutine。在正常模式下,直接唤醒队头goroutine。在饥饿模式下,将锁资源交给队头goroutine,并唤醒它继续运行。

接下来,我们将详细解析mutex的Lock()和Unlock()方法的代码流程,提供更深入的理解。对于感兴趣的朋友,欢迎关注公众号「阅新技术」,获取更多推送文章。感谢大家的支持!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
RDL是什么意思 报税软件是什么意思 某公司的财务报表管理软件属于 报表系统指的是什么? 怎么玩真三最好?我是新手选什么英雄最好? 真三新手玩什么英雄好? 最近玩魔兽真三,想请问一下高手,初期用什么英雄最好,新手攻略 新手玩真三选什么英雄好啊 ...离泡还有一段距离的地方好几片红,红的地方又疼又痒的,怎么办... 眼角出了好多小水疱.医生说是疱疹.怎么办 Linux系统编程之互斥量mutex golang之sync包 木马文件上传防御策略及几种绕过检测方式 Go 中的 Mutex 设计原理详解(二) WEBshell与文件上传漏洞 关于go 中 mutex 和 atomic 的思考 cod试验是什么意思? 棉花加工加工原理 旧毛线加工被子机器怎么清理 ESM单号 EH926558003CS EH133405757CS. 怎么查不到 空调出现OR或者EH是什么故障代码? 空调故障EH是什么意思? .速冻柜温度显示5EEH ip1是什么意思? 求你心目中认为最美的韩国美女图片,谢谢! 浩特ht-16电磁炉不加热显e0 豉汁蒸排骨的家常做法是什么? 如何在家制作豉汁蒸排骨? 家常菜豉汁蒸排骨怎么做才能入味好吃? 家常菜豉汁蒸排骨的做法有哪些? 学编导需要艺考吗?需要的话,我应该怎么准备呢? 怎么烹饪牛蹄比较好吃? 和平精英华为uzi皮肤怎么兑换介绍_和平精英华为uzi皮肤怎么兑换是什么... 和平精英uzi兑换码大全 2021uzi礼包兑换码分享-新手攻略-安族网_百度... 和平精英uzi红色方程式皮肤怎么得_和平精英uzi红色方程式皮肤获得方法... 和平精英UZI-影袭皮肤介绍_和平精英UZI-影袭皮肤是什么 医疗保险金报销医疗保险金的话医院方面应出示的证明 关于医保手工报销流程的问题 ...住院的时候没有拿社保卡 之后该怎么样报销? 肌酸激酶偏高是什么引起的 血清肌酸激酶偏高是怎么回事 美的KFR-72LW/DY-DE(R2)保修信息 美的KFR-72LW/DY-HA(R2)保修信息 美的KFR-72LW/DY-HA(R2)售后服务 美的KFR-72LW/DY-V2(E2)保修信息 美的KFR-72LW/DY-W(E2)保修信息 美的KFR-72LW/DY-IB(R3)保修信息 美的KFR-72LW/DY-MA(R3)保修信息 美的KFR-72LW/DY-E3(E3)的保修期是多久? 九个月宝宝断奶不喝奶粉怎么办 8个月大的宝宝不爱喝奶粉怎么办