go语言--锁

锁的基础,go的锁是构建在原子操作和信号锁之上的

原子锁

原子包实现协程的对同一个数据的操作,可以实现原子操作,只能用于简单变量的简单操作,可以把多个操作变成一个操作

sema锁

也叫信号量锁/信号锁

核心是一个uint32值,含义是同时可并发的数量

每一个sema 锁都对应一个SemaRoot结构体

SemaRoot中有一个平衡二又树用于协程排队

获取锁: uint32减一,获取成功

释放锁: uint32加一,释放成功

treap 指针指向sudog

如果uint32为0 获取锁: 协程gopark休眠,进入堆树等待

释放锁: 从堆树中取出一个协程,唤醒

sema锁退化成一个专用休眠队列

sema经常被用作休眠队列

相关推荐
Mgx2 小时前
用 Go 手搓一个 NTP 服务:从“时间混乱“到“精准同步“的奇幻之旅
go
wohuidaquan4 小时前
本地生活曝光缺失?GEO语义锚点来救场
go
代码扳手5 小时前
Golang + Genkit 实战:告别手动周报,让 AI 帮你整理一切!
go·ai编程
砖业林coco7 小时前
go语言使用 zhinao-go 轻松调用 360智脑
llm·go
百锦再9 小时前
第6章 结构体与方法
android·java·c++·python·rust·go
Kapaseker10 小时前
Go 语言真正擅长的领域是什么?
go
百锦再11 小时前
第5章 所有权系统
运维·git·python·eclipse·go·github·负载均衡
Mgx1 天前
深入理解 Windows 全局键盘钩子(Hook):拦截 Win 键的 Go 实现
go
王中阳Go1 天前
又整理了一场真实Golang面试复盘!全是高频坑+加分话术,面试遇到直接抄
后端·面试·go
itarttop1 天前
Go Error 全方位解析:原理、实践、扩展与封装
go