go语言--锁

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

原子锁

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

sema锁

也叫信号量锁/信号锁

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

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

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

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

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

treap 指针指向sudog

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

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

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

sema经常被用作休眠队列

相关推荐
AI编程探险者43 分钟前
Go 编译的二进制突然跑不起来了?凶手是 macOS 的 syspolicyd
go
用户398346161203 小时前
10 个示例快速入门 Go-Spring|v1.3.0 正式发布
go
zhouwy1131 天前
Golang 基础与实战笔记:从语法到微服务的全面指南
开发语言·go
日火2 天前
Go:实现基于mutex的环形缓冲区
go
审判长烧鸡3 天前
GO错误处理【7】层层递进,环环相扣
go·报错处理
审判长烧鸡4 天前
Go结构体与指针【3】自动解引用
go·指针·结构体·自动解引用
审判长烧鸡4 天前
【GO VS PHP】之 指针/引用传递
go·php·指针·引用传递
审判长烧鸡4 天前
GO错误处理【4】报错即链条
go·异常处理·错误处理
审判长烧鸡4 天前
GO时区【1】定义与使用
go·时区
审判长烧鸡4 天前
GO错误处理【5】显式错误处理
go·错误处理·报错链条