利用PV操作实现读者-写者问题(读者优先、写者优先)

.读者优先

1.写者、读者互斥访问文件资源。
2.多个读者可以同时访问文件资源。
3.只允许一个写者访问文件资源。

.算法

Program reders writers;
Var r_w_w:semaphore;
    mutex:semaphore;
    read_count:integer;
    
Procedure writers;
begin
    P(r_w_w);
    {writer ops}
    V(r_w_w);
End;

Procedure reders;
begin
    P(mutex);
    read_count:=read_count+1;
    if read_count=1 Then P(r_w_w);
    V(mutex);
    {read ops}
    P(mutex);
    read_count:=read_count-1;
    if read_count=0 Then V(r_w_w);
    V(mutex);
end;

begin
    read_counr:=0;
    r_w_w.value:=1;
    mutex.value:=1;
    cobegin
       r1:reder;...;rm:reder;
       w1:writer;...;wn:writer;
    coend
end;

.写者优先

1.写者线程的优先级高于读者线程。
2.当有写者到来时应该阻塞读者线程的队列。
3.当有一个写者正在写时或在阻塞队列时应当阻塞读者进程的读操作,直到所有写者进程完成写操作时放开读者进程。
4.当没有写者进程时读者进程应该能够同时读取文件。

.算法

Program reders writers;
Var r_w_w:semaphore;
    mutex:semaphore;
    mutex2:semaphore;
    s:semaphore;
    read_count:integer;
    write_count:integer;
    
Procedure writers;
begin
    P(mutex2);
    write_count:=write_count+1;
    if write_count=1 Then P(s);
    V(mutex2);
    P(r_w_w);
    {writer ops}
    V(r_w_w);
    P(mutex2);
    write_count:=write_count-1;
    if write_count=0 Then V(s);
    V(mutex2);
End;

Procedure reders;
begin
    P(s);
    P(mutex);
    read_count:=read_count+1;
    if read_count=1 Then P(r_w_w);
    V(mutex);
    V(s);
    {read ops}
    P(mutex);
    read_count:=read_count-1;
    if read_count=0 Then V(r_w_w);
    V(mutex);
end;

begin
    read_count:=0;
    write_count:=0;
    r_w_w.value:=1;
    mutex.value:=1;
    mutex2.value:=1;
    s.value:=1;
    cobegin
       r1:reder;...;rm:reder;
       w1:writer;...;wn:writer;
    coend
end;
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值