go语言--锁

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

原子锁

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

sema锁

也叫信号量锁/信号锁

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

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

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

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

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

treap 指针指向sudog

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

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

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

sema经常被用作休眠队列

相关推荐
岁忧3 小时前
(LeetCode 每日一题) 3541. 找到频率最高的元音和辅音 (哈希表)
java·c++·算法·leetcode·go·散列表
程序员爱钓鱼9 小时前
Go语言实战案例 — 工具开发篇:编写一个进程监控工具
后端·google·go
刘媚-海外20 小时前
Go语言开发AI应用
开发语言·人工智能·golang·go
Aurora_NeAr1 天前
Golang并发编程及其高级特性
后端·go
郭京京1 天前
goweb模板语法html/template
后端·go
Yvonne爱编码1 天前
后端编程开发路径:从入门到精通的系统性探索
java·前端·后端·python·sql·go
程序员爱钓鱼1 天前
Go语言实战案例 — 工具开发篇:Go 实现条形码识别器
后端·google·go
creator_Li2 天前
Gin框架学习
go·gin
郭京京2 天前
goweb内置的响应2
后端·go
郭京京2 天前
goweb内置的响应1
后端·go