go语言--锁

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

原子锁

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

sema锁

也叫信号量锁/信号锁

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

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

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

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

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

treap 指针指向sudog

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

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

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

sema经常被用作休眠队列

相关推荐
yiqiefeimeng2 小时前
Rust还是Go?编程语言的未来之争
rust·go·编程语言·技术社区·未来之争
唐青枫4 小时前
别把 GORM 当 SQL 生成器:Go GORM 从模型映射到事务实战详解
go
妙码生花5 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(五十四):管理员个人资料页面、管理员日志优化
前端·后端·go
他们叫我秃子8 小时前
前端开发转 Go 全栈(四):代码写在前面,却要最后执行?我终于搞懂了 defer
前端·后端·go
他们叫我秃子12 小时前
前端开发转 Go 全栈(三):从函数到 error,Go 连“失败”都要明确返回
前端·后端·go
程序员爱钓鱼13 小时前
Go 数字类型详解
后端·面试·go
妙码生花1 天前
从 PHP 到 AI + Golang,程序员自救转型手记(五十二):管理员权限检查中间件,AI 随意放行预闯大祸
前端·后端·go
小满zs1 天前
Go语言第六章(结构体)
后端·go