Go 源码深度解析之读写锁 sync.RWMutex(数据结构/读写操作)
一、简介
写在前面:先写个结论,让大家对该结构的源码有个大概了解,之后再一步一步解析源码:
- 写锁 需要阻塞 写锁:一个协程拥有 写锁 时,其他协程 写锁定 需要阻塞
- 写锁 需要阻塞 读锁:一个协程拥有 写锁 时,其他协程 读锁定 需要阻塞
- 读锁 需要阻塞 写锁:一个协程拥有 读锁 时,其他协程 写锁定 需要阻塞
- 读锁 不能阻塞 读锁:一个协程拥有 读锁 时,其他协程也可以拥有 读锁
- 写操作通过 readerCount 的操作来阻止读操作的
二、源码
(一)RWMutex数据结构
type RWMutex struct {
w Mutex // 写锁
writerSem uint32 // 缓冲信号量,获取写锁的阻塞等待信号队列
readerSem uint32 // 缓冲信号量,获取读锁的阻塞等待信号队列
readerCount int32 // 当前持有读锁的 goroutine 数量,负数表示有个写锁在执行
readerWait int32 // 获取写锁时,如果之前还有 readerWait 数量的读锁在执行,则需要等待执行完才能获取写锁
}-
w