条件:
互斥变量
wMutex = 1 //写互斥变量
wCountMutex = 1 //写数量记录互斥变量
rMutex = 1 // 读互斥变量
rCountMutex = 1 //读数量记录互斥变量
共享变量
wCount = 0 //写进程的数量
rCount = 0 //读进程的数量
write
// 记录写进程的数量,如果是第一个写进程则封锁读进程,保证写进程的优先级
P(wCountMutex)
if(wCount==0)
P(rMutex)
wCount++;
V(wCountMutex)
// 保证写者互斥
P(wMutex)
write
V(wMutex)
// 读完后修改写进程的数量,并在所有写进程都完成时允许读进程操作
P(wCountMutex)
wCount--;
if(wCount==0)
V(rMutex)
V(wCountMutex)
read
// 首先先要保证读进程在写进程全部完成前不能进行,立即执行V操作是为了保证读操作可同时进行
// 这样的另一个目的是当有写进程来的时候也可以直接申请(rMutex),这样便可以将后续读进程锁住,保证写进程优先执行
P(rMutex)
V(rMutex)
// 统计当前的读进程的数量,并在开始时申请封锁写进程
P(rCountMutex)
if(rCount==0)
P(wMutex)
rCount++
V(rCountMutex)
read
// 当所有在写进程之前来的读进程都执行完毕后释放对写进程的封锁
P(rCountMutex)
rCount--
if(rCount==0)
V(wMutex)
V(rCountMutex)