go锁--读写锁

go锁--读写锁_第1张图片每个锁分为读锁和写锁,写锁互斥
没有加写锁时,多个协程都可以加读锁
加了写锁时,无法加读锁,读协程排队等待
加了读锁,写锁排队等待

go锁--读写锁_第2张图片

Mutex用来写协程之间互斥等待
读协程使用readerSem等待写锁的释放
写协程使用writerSem等待读锁的释放
readerCount记录读协程个数
readerWait记录写协程之前的读协程个数

go锁--读写锁_第3张图片

写锁

先加互斥锁,readerCount变成0  并且把他变成 -rwmutexMaxReaders,写锁增加成功

go锁--读写锁_第4张图片

表示有3个协程增加了读锁

将readerCount=3-rwmutexMaxReaders  表示前面有3个读锁,负数表示有写锁等待

readerWait=3  3个读锁即将释放

先加mutex写锁,若已经被加写锁会阻塞等待
将readerCount变为负值,阻塞读锁的获取
计算需要等待多少个读协程释放如果需要等待读协程释放,陷入writerSem

go锁--读写锁_第5张图片

解写锁

go锁--读写锁_第6张图片

将readerCount变为正值,允许读锁的获取
释放在readerSem中等待的读协程
解锁mutex

读锁:

go锁--读写锁_第7张图片

go锁--读写锁_第8张图片

将给readerCount无脑加一
如果readerCount是正数,加锁成功
如果readerCount是负数,说明被加了写锁,陷入readerSem

解读锁

给readerCount减-
如果readerCount是正数,解锁成功
如果readerCount是负数,有写锁在排队

如果自己是readerWait的最后一个,唤醒写协程

你可能感兴趣的:(Go,go)