RWMetux
- 本质实现为信号量加Metux锁实现
- 结构
- m sync.Metux
- writerSem uint32
- 写信号量,用于等待读完成
- readerSem uint32
- 读信号量,用于等待写完成
- readerCount int32
- 正在读的数量
- readerWait int32
- 准备离开的数量,也即有多少个在等待RUnlock操作
- 实现
- RLock()
- readercount加1,并检查当前的readerCount是否小于0(因为lock操作会减一个大数将该值变为负数),是则当前处于加写锁状态,阻塞自己,等待readerSem信号量的唤醒
- RUnlock()
- readercount减1,并检查当前的readerCount是否小于0,是则当前处于加写锁的状态,继续对readerwait数量减1,当这个值减1后等于0时,意味着当前等待释放读锁的操作都已释放读锁,则通过释放写信号量通知处于等待状态的写锁
- (runtime_Semrelease(&rw.writerSem, false, 1)
- readercount减1,并检查当前的readerCount是否小于0,是则当前处于加写锁的状态,继续对readerwait数量减1,当这个值减1后等于0时,意味着当前等待释放读锁的操作都已释放读锁,则通过释放写信号量通知处于等待状态的写锁
- Lock()
- 先加锁阻塞其他写锁加锁,通过减去一个大数控制新进来的读锁请求进行阻塞。
- 检查当前正在读的数量,即已获取到读锁的数量,如果存在,则把数量添加到readerWait等待变量,然后将自己挂起,等待接收到writerSem写信号量
- Unlock()
- 给当前的readerCount加回一个大数(即lock减去的数),然后检查当前数量是否大于0,也即是否有读锁请求被阻塞,有的话,轮询请求数量将readerSem进行通知,已确保加读锁时的阻塞操作恢复执行“
- RLock()