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)
    • Lock()
      • 先加锁阻塞其他写锁加锁,通过减去一个大数控制新进来的读锁请求进行阻塞。
      • 检查当前正在读的数量,即已获取到读锁的数量,如果存在,则把数量添加到readerWait等待变量,然后将自己挂起,等待接收到writerSem写信号量
    • Unlock()
      • 给当前的readerCount加回一个大数(即lock减去的数),然后检查当前数量是否大于0,也即是否有读锁请求被阻塞,有的话,轮询请求数量将readerSem进行通知,已确保加读锁时的阻塞操作恢复执行“