江苏工信部网站备案,WordPress写小说插件,asp sql网站安全性,丽水专业网站建设公司每个锁分为读锁和写锁#xff0c;写锁互斥 没有加写锁时#xff0c;多个协程都可以加读锁 加了写锁时#xff0c;无法加读锁#xff0c;读协程排队等待 加了读锁#xff0c;写锁排队等待 Mutex用来写协程之间互斥等待 读协程使用readerSem等待写锁的释放 写协程使用writer…每个锁分为读锁和写锁写锁互斥 没有加写锁时多个协程都可以加读锁 加了写锁时无法加读锁读协程排队等待 加了读锁写锁排队等待 Mutex用来写协程之间互斥等待 读协程使用readerSem等待写锁的释放 写协程使用writerSem等待读锁的释放 readerCount记录读协程个数 readerWait记录写协程之前的读协程个数 写锁
先加互斥锁readerCount变成0 并且把他变成 -rwmutexMaxReaders写锁增加成功 表示有3个协程增加了读锁
将readerCount3-rwmutexMaxReaders 表示前面有3个读锁负数表示有写锁等待
readerWait3 3个读锁即将释放
先加mutex写锁若已经被加写锁会阻塞等待 将readerCount变为负值阻塞读锁的获取 计算需要等待多少个读协程释放如果需要等待读协程释放陷入writerSem 解写锁 将readerCount变为正值允许读锁的获取 释放在readerSem中等待的读协程 解锁mutex
读锁 将给readerCount无脑加一 如果readerCount是正数加锁成功 如果readerCount是负数说明被加了写锁陷入readerSem
解读锁
给readerCount减- 如果readerCount是正数解锁成功 如果readerCount是负数有写锁在排队
如果自己是readerWait的最后一个唤醒写协程