go语言--锁

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

原子锁

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

sema锁

也叫信号量锁/信号锁

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

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

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

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

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

treap 指针指向sudog

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

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

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

sema经常被用作休眠队列

相关推荐
我叫黑大帅8 小时前
Go 语言并发编程的 “工具箱”
后端·面试·go
tyung9 小时前
zhenyi-base 开源 | Go 高性能基础库:TCP 77万 QPS,无锁队列 16ns/op
后端·go
代码搬运媛14 小时前
Go 语言通道 (Channel) 深度用法讲解及实战
后端·go
程序员爱钓鱼14 小时前
Go生成唯一ID的标准方案:github.com/google/uuid使用详解
后端·google·go
我叫黑大帅17 小时前
Go 语言中处理「未知类型数据」的两大核心手段
后端·面试·go
下次一定x1 天前
深度解析 Kratos 客户端服务发现与负载均衡:从 Dial 入口到 gRPC 全链路落地(上篇)
后端·go
程序员爱钓鱼2 天前
Go操作Word文档实战:github.com/nguyenthenguyen/docx
后端·google·go
火莲华2 天前
go cond 探索
go
程序员爱钓鱼3 天前
GoHTML解析利器:github.com/PuerkitoBio/goquery实战指南
后端·google·go
我叫黑大帅3 天前
Go中的interface的两大用法
后端·面试·go