type RWMutex struct{
w Mutex // held if there are pending writers
writerSem uint32// semaphore for writers to wait for completing readers
readerSem uint32// semaphore for readers to wait for completing writers
readerCount int32// number of pending readers
readerWait int32// number of departing readers}
w : 互斥锁,写 协程获得该锁后,其他协程处于等待
writerSem :writer 等待 读完成排队的信号量
readerSem : read 等待 write 完成排队的信号量
readerCount : 读锁的计数器
readerWait : 等待读锁释放的数量
3、常量定义
const rwmutexMaxReaders =1<<30
go支持的最高加读锁的数量 4294967296,go中对读锁的数量采用负值计算,逐渐递减
4、接口定义
RLock():读锁定
RUnlock():解除读锁定
Lock(): 写锁定,与Mutex完全一致
Unlock():解除写锁定,与Mutex完全一致
5、读锁
5.1 读加锁
RLock 代码
// RLock locks rw for reading.//// It should not be used for recursive read locking; a blocked Lock// call excludes new readers from acquiring the lock. See the// documentation on the RWMutex type.func(rw *RWMutex)RLock(){
// 竞争检测if race.Enabled {
_= rw.w.state
race.Disable()}// readerCount 加一// 如果小于0,说明目前是写锁定,进入阻塞if atomic.AddInt32(&rw.readerCount,1)<0{
// A writer is pending, wait for it.// 等待写锁释放runtime_SemacquireMutex(&rw.readerSem,false,0)}// 是否开启静态检测if race.Enabled {
race.Enable()
race.Acquire
读写锁 RWMutex1、概念读写锁和互斥锁都是为了防止并发而加的锁读写锁相比互斥锁,就是增加了对读写的控制读写锁 写写之间是互斥的,读写也是互斥的,但是读锁 是可以添加多个的2、RWMutex 代码type RWMutex struct { w Mutex // held if there are pending writers writerSem uint32 // semaphore for writers to wait for completing