RWMutex读写互斥锁实现

写锁

func (rw *RWMutex) Lock() {
    // 竞态检测
	if race.Enabled {
		_ = rw.w.state
		race.Disable()
	}
	// 使用Mutex锁
	rw.w.Lock()
	// 说明写锁已经被获取
	r := atomic.AddInt32(&rw.readerCount, -rwmutexMaxReaders) + rwmutexMaxReaders
	// 等待读者为0,写者挂起
	if r != 0 && atomic.AddInt32(&rw.readerWait, r) != 0 {
		runtime_Semacquire(&rw.writerSem)
	}
	// 竞态检测
	if race.Enabled {
		race.Enable()
		race.Acquire(unsafe.Pointer(&rw.readerSem))
		race.Acquire(unsafe.Pointer(&rw.writerSem))
	}
}

读锁

func (rw *RWMutex) RLock() {
    // 竞态检测
	if race.Enabled {
		_ = rw.w.state
		race.Disable()
	}
	// 每次goroutine获取读锁时,readerCount+1
    // 如果写锁已经被获取,那么readerCount在-rwmutexMaxReaders与0之间,这时挂起获取读锁的goroutine,
    // 如果写锁没有被获取,那么readerCount>0,获取读锁,不阻塞
    // 通过readerCount判断读锁与写锁互斥,如果有写锁存在就挂起goroutine,多个读锁可以并行
	if atomic.AddInt32(&rw.readerCount, 1) < 0 {
		// 将goroutine排到G队列的后面,挂起goroutine
		runtime_Semacquire(&rw.readerSem)
	}
	// 竞态检测
	if race.Enabled {
		race.Enable()
		race.Acquire(unsafe.Pointer(&rw.readerSem))
	}
}