go语言--锁

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

原子锁

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

sema锁

也叫信号量锁/信号锁

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

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

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

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

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

treap 指针指向sudog

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

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

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

sema经常被用作休眠队列

相关推荐
ylj_dev10 小时前
从 0 构建 AI Workload Platform(七):可观测性、故障注入与性能验证
go·prometheus·可观测性·opentelemetry·故障注入
我的div丢了肿么办14 小时前
go语言中基本数据类型的转换
后端·go
newerp2 天前
语法分析与 AST:Parser 与 go/ast
后端·程序员·go
newerp2 天前
Go 编译过程全景
后端·程序员·go
stark张宇2 天前
Go语言runtime全景图:从编译到GC,带你彻底吃透Go的底层血脉
后端·go
名字还没想好☜2 天前
Go 用 slices/maps 标准库泛型函数:告别手写 Contains、Sort、去重(Go 1.21)
开发语言·后端·算法·golang·go
运维开发笔记3 天前
5.2 Go 数组进阶学习笔记(多维、排序、搜索)
go
newerp4 天前
Redis 操作与缓存策略
后端·程序员·go
newerp4 天前
GORM ORM 基础
后端·程序员·go
newerp4 天前
CRUD 操作与预处理语句
后端·程序员·go