RWMutex核心还是基于Mutex的,如果想了解Mutex的话可以看一下我上一篇写的Mutex的文章
RWMutex的特性就是支持并发读。适用于读多写少的场景。
RWMutex的定义
type RWMutex struct {
w Mutex // 互斥锁
writerSem uint32 // 写锁用的信号量
readerSem uint32 // 读锁用的信号量
readerCount int32 // 当前正在执行读操作的goroutine数量
readerWait int32 // 获取写锁时,当前还持有读锁的goroutine数量
}
const rwmutexMaxReaders = 1 << 30
RWMutex.Lock()
func (rw *RWMutex) Lock() {
// 首先调用Mutex的Lock方法获取到锁
rw.w.Lock()
// 把readerCount改成负数,这样后续的读操作就会被阻塞
// r 就是当前正在执行读操作的goroutine数量
r := atomic.AddInt32(&rw.readerCount, -rwmutexMaxReaders) + rwmutexMaxReaders
// 如果当前有正在执行读操作的goroutine
// 把r赋值给readerWait
if r != 0 && atomic.AddInt32(&rw.readerWait, r) != 0 {
// 获取写锁的goroutine进入休眠,等待被唤醒
runtime_SemacquireMutex(&rw.writerSem, false, 0)
}
}

本文探讨了Go中的RWMutex,它基于Mutex并支持并发读操作,适合读多写少的场景。文章详细阐述了RWMutex的读锁和写锁的获取与释放流程,包括读锁增加和减少、写锁的获取与释放以及如何处理读者和写者的同步问题。通过对RWMutex的深入理解,有助于更好地掌握Go的并发控制。
最低0.47元/天 解锁文章
721

被折叠的 条评论
为什么被折叠?



