您的当前位置:首页正文

第二类读者写者问题:写者优先

2024-11-22 来源:个人技术集锦

第二类读者写者问题:写者优先

条件:

  • 多个读者可以同时进行读
  • 写者必须互斥(只允许一个写者写,也不能读者写者同时进行)
  • 写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)
互斥变量
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)
显示全文