用信号量进程同步与互斥

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

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

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

  答:在两个进程同时进行时,结果会不唯一,因为不同步。

    由于异常的中断,导致判断条件的重复错误,最后导致永远等待。

2.哲学家吃面问题

3.读写文件问题

4.理发师问题

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

  答: Semaphore[] forks= new Semaphore[]{new Semaphore(1),new Semaphore(1),new Semaphore(1),new Semaphore(1),new Semaphore(1)};

        Semaphore limit = new Semaphore(4);
        for(int i=0;i<5;i++){
            final int index=i;
            new Thread(()->{
                while(true){
                    try {
                        limit.acquire();
                        forks[index].acquire(); //P(index)
                        forks[(index+1)%5].acquire();//P((index+1)%mod5)
                        System.out.println("第"+index+"个哲学家在通心粉");
                        forks[index].release();
                        forks[(index+1)%5].release();
                        limit.release();
                        System.out.println("第"+index+"个哲学家吃完了");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }

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

  答:semaphore mutex=A, customer_count=0:
  main()
  {  
  Cobegin
  Customeri()
  {
  p(mutex);
  取号码,进入队列;
  v(mutex);
  v(customer_count);
  }
  serversi()
  {
  while(A)
  {
  p(customer_count);
  p(mutex);
  从队列中取下一个号码;
  v(mutex);
  为该号码持有者服务;
  }  
  end
  Coend

7.下面是两个并发执行的进程。它们能正确运行吗?若不能请举例说明,并改正之。(5分)

parbegin

    var X:integer;

    process  P1                    process  P2

    var y,z:integer:            var t,u:integer;

     begin                          begin

       x:=1;                           x:=0:

       y:=0:                           t=0;   

       if  x≥l  then y:=y十1;    if  x≤l  then  t:=t+2;

            z:=y;                           u:=t;

     end;                         end;

parend.

   答:能。

8.九、在一个盒子里,混装了相等数量的黑棋子和白棋子,现要用自动分拣系统把黑棋子和白棋子分开,该系统由两个并发执行的进程P1和P2组成,其中进程P1专门拣黑子,进程P2专门拣白子。规定两个进程轮流拣子且每个进程每次只拣一个子。当一个进程在拣子时不允许另一个进程去拣子,并设P1先拣。请用P,V操作管理这两个并发进程,使其能正确实现上述功能。

   答:var S1,S2:semaphore;

S1:=1;S2:=0;

cobegin

{

process P1

begin

repeat

P(S1);

拣白子

V(S2);

until false;

end

process P2

begin

repeat

P(S2);

拣黑子

V(S1);

until false;

end

}

coend.

posted @ 2019-05-02 22:19  赫赫核  阅读(317)  评论(0编辑  收藏  举报