P、V操作

 假定有3个进程R、W1、W2共享一个缓冲区B,B中每次只能存放一个数。进程R从输入设备读入一个数,把它存放到缓冲区B里。如果存入的是奇数,则由进程W1取出打印;如果存入的是偶数,则由进程W2取出打印。规定进程R只有在缓冲区B为空或内容已经被打印后才能进行存放;进程W1和W2不能从空缓冲区里取数,也不能重复打印。试用信号量及其P、V操作管理这3个进程,让它们能够协调地正确工作。

    Semaphore empty,SW1,SW2;         //先设置3个信号量
    empty.value=1;SW1.value=0;SW2.value=0;
    cobegin
    process R()
    {
    int a;
    while(1)
    {
    P(empty);         //判断缓冲区B是否为空,并且让进程R进行存放
    B=a;     //把读入的变量a中的数赋值给缓冲区B
    if(a%2==1)      //判断奇偶数
    V(SW1);     //如果读入的是奇数,则向进程W1发出信号
    else
    V(SW2);     //如果读入的是偶数,则向进程W2发出信号
    }
    }
    process W1() 
    {
    int b;
    while(1)
    {
    P(SW1);     //收到进程R发过来的信号,读入的数是一个奇数
    b=B;     //取出缓冲区B中的奇数到变量b中,使得缓冲区B为空
    V(empty);          //向进程R发出信号,使进程R又可以向缓冲区B读入一个整数
    }
    }    //打印
    process W2()
    {
    int c;
    while(1)
    {
    P(SW2);     //收到进程R发过来的信号,读入的数是一个偶数
    c=B;     //取出缓冲区B中的偶数到变量c中,使得缓冲区B为空
    V(empty);         //向进程R发出信号,使进程R又可以向缓冲区B读入一个整数
    }
    }    //打印
    coend
 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值