用信号量进程同步与互斥

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

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

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

答:结果不唯一:两个进程同时进行时,结果会不唯一;永远等待:由于异常的中断,导致判断条件的重复错误。

2.哲学家吃面问题

semaphore fork[5];

                           for(int i=0; i<5;i++)

                                fork[i]=1;

                      cobegin

                            process philosopher_i( ){

                                       while(ture){

                                                      think( );

                                                       P(fork[i]);

                                                       P(fork[(i+10%5]);

                                                                eat();

                                                       V(fork[i]);

                                                       V(fork[(i+10%5]);

                                                            }

                                           }

coend

3.读写文件问题

nt readcount=0;

semaphore writeblock=1,mutex=1;

cobegin

process reader_i() {

         P(mutex);

       readcount++;

        if(readcount==1)

          P(writerblock);

          V(mutex);

          /*读文件*/

         P(mutex);

         readcount--;

         if(readcount==0)

                  V(writeblock);

           V(mutex);  }

coend

4.理发师问题

int waiting=0, chairs=n;

semaphore customers=0,barbers=0,mutex=1;

cobegin

     process barbers() {

           while(ture) {

                P(customers);

                P(mutex);

                waiting--;

                V(barbers); 

                V(mutex);

                cuthair();  } }

process customer_i() {

               P(mutex);

               if(waiting<chairs) {

                     waiting++;

                      V(customers);

                       V(mutex);

                       P(barbers):

                       get_haircut();

}

else

        V(mutex);

}

coend

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

semaphore muext=1;

cobegin

process boss(){

             P(muext);

            /*老板任意出售两种*/

             V(muext);

}

 

process musiclovers_i() {

               while(ture){

                P(muext);

                 listening();

                V(muext);

}  }

coend

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

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

int waiting=0;

cobegin

  process clerk() {

                   while(ture){

                            P(customers);

                            P(mutex);

                            waiting--;

                            V(clerk);

                            V(mutex);

                             service();

} }

process customer_i() {

                     P(mutex);

                     waiting++;

                      V(customers);

                       V(mutex);

                       P(clerk):

                     get_service();

}

coend

posted on 2019-05-06 21:07  XHM丶  阅读(127)  评论(0编辑  收藏  举报

导航