Linux的pv信息量读写者问题,第二类读者写者问题(写者优先)的信号量及PV操作解决方案...

要求: (1)多个读者可以同时进行读;

(2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行);

(3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)。

定义读者与写者两个队列: ReadQ与WriterQ,初始值均为空;

定义文件状态 FileState变量,0, write与read三个状态,初始值为0。

若不考虑互斥情况的代码为:

Read()

ReadQ.push();        //读者入队

if((ReadQ.Length()!=0)&&(FileState!=write)&&(WriteQ.Length()==0))

{

FileState=read;

ReadQ.do();            //队列中全部读者执行读操作,队列清空

FileState=0;

}

Writer()

{

WriterQ.push();        //写者入队

if((WriterQ.Length()!=0)&&(FileState!=read))

{

FileState=write;

writer=WriterQ.pop();

writer.do();        //写者执行写操作

FileState=0;

}

}    考虑到互斥的情况,添加变量readcount,初始值为0,并设置信号量mutex。

对应上面的读者与写者两个队列(ReadQ与WriterQ),文件状态 FileState变量设置三个信号量,依次为mutexReadQ,mutexWriterQ和mutexFileState。

代码如下:

Read()

P(mutexWriteQ);

while(WriteQ.Length()!=0)

/*忙等待*/;

V(mutexWriteQ);

P(mutex);

readcount ++;

if (readcount==1)

P(mutexFileState);

V(mutex);

Read.do();    //读者执行读操作

P(mutex);

readcount --;

if (readcount==0)

V(mutexFileState);

V(mutex);

Writer()

{

P(mutexWriteQ);

WriterQ.push();        //写者入队

V(mutexWriteQ);

P(mutexFileState);

P(mutexWriteQ);

writer=WriterQ.pop();

V(mutexWriteQ);

writer.do();        //写者执行写操作

V(mutexFileState);

V(mutexWriteQ);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值