每个锁分为读锁和写锁,写锁互斥
没有加写锁时,多个协程都可以加读锁
加了写锁时,无法加读锁,读协程排队等待
加了读锁,写锁排队等待
Mutex用来写协程之间互斥等待
读协程使用readerSem等待写锁的释放
写协程使用writerSem等待读锁的释放
readerCount记录读协程个数
readerWait记录写协程之前的读协程个数
写锁
先加互斥锁,readerCount变成0 并且把他变成 -rwmutexMaxReaders,写锁增加成功
表示有3个协程增加了读锁
将readerCount=3-rwmutexMaxReaders 表示前面有3个读锁,负数表示有写锁等待
readerWait=3 3个读锁即将释放
先加mutex写锁,若已经被加写锁会阻塞等待
将readerCount变为负值,阻塞读锁的获取
计算需要等待多少个读协程释放如果需要等待读协程释放,陷入writerSem
解写锁
将readerCount变为正值,允许读锁的获取
释放在readerSem中等待的读协程
解锁mutex
读锁:
将给readerCount无脑加一
如果readerCount是正数,加锁成功
如果readerCount是负数,说明被加了写锁,陷入readerSem
解读锁
给readerCount减-
如果readerCount是正数,解锁成功
如果readerCount是负数,有写锁在排队
如果自己是readerWait的最后一个,唤醒写协程