信号量进程同步与互斥

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();

扫描二维码关注公众号,回复: 6142153 查看本文章

                                                       V(fork[i]);

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

                                                            }

                                           }

coend

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

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、

semaphore mutex=A, customer_count=0:
Cobegin
Customeri(){
p(mutex);
取号码,进入队列;
v(mutex);
v(customer_count);
}


serversi(){
while(A){
p(customer_count);
p(mutex);
从队列中取下一个号码;
v(mutex);
为该号码持有者服务;
}
}
Coend

7、

Cobegin
Var x:integer; s:semaphore;
s:=A


Process PA
Var y, z:integer;
Begin
p(s);
x:=A;
y:=0;
if x>=A then y:=y+A;
v(s);
z:=y;
End


Process PB
Var t, u:integer;
Begin
p(s);
x:=0;
t:=0;
if x<A then t:=t+B;
v(s);
u:=t;
End


Coend

8、

semaphore S1,S2;
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.

猜你喜欢

转载自www.cnblogs.com/huchen826089/p/10822161.html