用信号量进程同步与互斥

1..理解生产者和消费者问题

没有引入信号量时的生产者和消费者进程,什么情况下会出现结果不唯一?什么情况下会出现永远等待?

用信号解决生产者和消费者的同步与互斥,要求能自己写出来。

答:生产者进程和消费者进程对counter的交替操作会使其结果不唯一。

生产者进程和消费者进程的交替执行会导致进程永远等待,造成系统死锁。

Int k;

Typedef anyitem item;

Item buffer[k];

Int in=0,out=,counter=0;

Process producer(void){

While(true){

{produce an item in nextp};

If(counter==k)

Sleep(producer);

Buffer[in]=nextp;

In-(in+)%k;

Counter++;

If(counter==1)

Wakeup(consumer);

}

}

Process consumer(void){

While(true){

If(counter==0)

Sleep(consumer);

Nextc=buffer[out];

Out=(out+1)%k;

Counter__;

If(counter==k-1)

Wakeup(producer);

{consume the item in nextc};

}

}

 5.在一间酒吧里有三个音乐爱好者队列,第一队的音乐爱好者只有随身听,第二队只有音乐磁带,第三队只有电池。而要听音乐就必须随身听、音乐磁带和电池这三种物品俱全。酒吧老板一次出售这三种物品中的任意两种。当一名音乐爱好者得到这三种物品并听完一首乐曲后,酒吧老板才能再一次出售这三种物品中的任意两种。于是第二名音乐爱好者得到这三种物品,并开始听乐曲。全部买卖就这样进行下去。试用Pv操作正确解决这一买卖。 

semaphore mutex=1,s1=0,s2=0,s3=0;

cobegin

    fan1(){

        s1=1;

       P(s2);

       P(s3);

      if(s1&&s2&&s3){

        V(mutex);
        V(s1);
        V(s2);
        V(s3);
          }

    }

 fan2(){

      s2=1;

       P(s1);

       P(s3);

      if(s1&&s2&&s3){

          V(mutex);
           V(s1);
          V(s2);
           V(s3);}

  }

 fan3(){

       s3=1;

       P(s1);

       P(s2);

      if(s1&&s2&&s3){

          V(mutex);
        V(s1);
        V(s2);
        V(s3);}

   }

}

Coend

6.某银行有人民币储蓄业务,由n个储蓄员负责。每个顾客进入银行后先取一个号,并且等着叫号。当一个储蓄人员空闲下来,就叫下一个号。请用PV操作正确编写储蓄人员和顾客进程的程序。

semaphore customers=0,mutex=n,check=0;

int waiting=0;

cobegin

     process check(){

      while(true)

        {

          P(customers);

          P(mutex);

          waiting--;

          V(check);

          V(mutex);

          }

    }

process customer_i() {

           P(mutex);

           waiting++;

           V(customers;

           V(mutex);

           P(clerk):

           get_service();

}

coend

 

posted @ 2019-05-05 22:31  郑静欣  阅读(232)  评论(0编辑  收藏  举报