读者-写者问题

mutex:互斥信号量,初值为1,用于使读进程互斥地访问共享变量readcount ;

wmutex:写互斥信号量,初值为1,用于实现写进程与其他进程(包括读进程与其他写进程)的互斥;

readcount:共享变量,初值为0,用于记录当前正在读数据集的读进程数目;

当一个读进程要读数据集时,readcount加1;如果此前(readcount加1之前)数据集中无读进程,应该对写互斥信号量wmutex做P操作,这样若数据集中无写进程则通过P操作阻止后续写进程写,若数据集中有写进程,则通过P操作让读进程等待。

类似的,当一个读进程完成读数据集的操作时,应将读进程计数readcount减1;如果此时(readcount减1后)数据集中已无读进程,还应该对写互斥信号量wmutex做V操作,以允许写进程写。

算法描述如下:

semaphore mutex=1;

semaphore wmutex=1;

int readcount=0;

main()

{

cobegin

reader();

writer();

coend

}

reader()

{

while(true)

{

p(mutex);

if(readcount==0) p(wmutex);//当第一个读进程读数据集时,阻止写进程写

readcount++;

v(mutex);

读数据集;

p(mutex);

readcount--;

if(readcount==0) v(wmutex);//当最后一个读进程读完数据集后,允许写进程写

v(mutex);

}

}

writer()

{

while(true)

{

p(wmutex)

写数据集;

v(wmutex);

}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值