go语言--锁

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

原子锁

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

sema锁

也叫信号量锁/信号锁

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

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

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

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

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

treap 指针指向sudog

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

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

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

sema经常被用作休眠队列

相关推荐
踏浪无痕1 小时前
Go 的协程是线程吗?别被"轻量级线程"骗了
后端·面试·go
程序员泡椒11 小时前
二分查找Go版本实现
数据结构·c++·算法·leetcode·go·二分
且去填词19 小时前
Go 语言的“反叛”——为什么少即是多?
开发语言·后端·面试·go
用户26851612107561 天前
GMP 调度器深度学习笔记
后端·go
Coding君1 天前
每日一Go-20、Go语言实战-利用Gin开发用户注册登录功能
go
用户26851612107561 天前
GMP 三大核心结构体字段详解
后端·go
corpse20102 天前
FastMonitor - 网络流量监控与威胁检测工具--各种报错!!!
go
源代码•宸4 天前
Leetcode—1929. 数组串联&&Q1. 数组串联【简单】
经验分享·后端·算法·leetcode·go
nil4 天前
记录protoc生成代码将optional改成omitepty问题
后端·go·protobuf
Way2top4 天前
Go语言动手写Web框架 - Gee第五天 中间件
后端·go