信号量(三) 经典例题(二)

 接上篇的信号量经典例题,其中包括“读者写者”,“过独木桥”,“公交车”,“四方恋爱”等

 

一. 读者写着问题(这里有很多种情况):

(1)读者优先

题目描述:有一本书,有多个读者和写者,读写互斥,写写互斥。当多个读者可以同时读,即当有读者在读这本书时,其他的读者也可以进来读,但写者就不能进来写。

解答:

信号量:

w:可写否:1

nReader:读者数 :0

mutex:读者之间的“互斥”,进出的先后顺序而已:1

写者:                读者

 

P(w)                P(mutex)

写                    nReader ++ 

V(w)                if(nReader == 1)//第一个读者

                             P(w)            //堵塞写者

                       V(mutex)

                       读

                       P(mutex)

                       nReader - -

                       if(nReader==0)//最后一个读者

                             V(w)          //唤醒写者

                        V(mutex)

 

(2)写者优先

题目描述:有一本书,有多个读者和写者,读写互斥,写写互斥,不同的是只要有写者等,后续读者必须等待在写者后面

w:可写否:1

nReader:读者数 :0

mutex:读者之间的“互斥”,进出的先后顺序而已:1

s:用于封锁后续读者 :1

写者:                读者

 

                       P(s)

P(s)                   P(mutex)

P(w)                nReader ++ 

写                    if(nReader == 1)//第一个读者

V(w)                      P(w)            //堵塞写者

V(s)                  V(mutex)

                       V(s)

                       读

                         P(mutex)

                       nReader - -

                       if(nReader==0)//最后一个读者

                             V(w)          //唤醒写者

                         V(mutex)

 

 

二.过独木桥

信号量(三) 经典例题(二)_第1张图片

 

 

题目描述:

桥单向通行,分别从西到东和从东到西

解答:

信号量:

s : 表示桥可用? :1

nw : 东向西人数 :0

ne :  西向东人数 : 0

m1: 互斥对nw的修改 :1

m2: 互斥对ne的修改  :1

 

ToWest                                                   ToEast

 

P(m1)                                                      P(m2)

nw++                                                      ne ++

if(1==nw)                                                if(1==ne)

    P(s)                                                           P(s) 

V(m1)                                                      V(m2)

cross the bridge  to west                        cross the bridge to east        

P(m1)                                                      P(m2)

nw--                                                        ne - -

if(0==nw)                                                if(0==ne)

    V(s)                                                           V(s)

V(m1)                                                      V(m2)

 

 

三.四方恋爱

题目描述:有两男两女,男士送女士玫瑰,女士送男士手表。一一对应,每个只能连接一个

解答:

(1)老师答案

信号量:

m1:互斥女士之间的收花送表行为:1

m2:互斥男士之间的收表送花行为:1

s1:有花? 0

s2:有表? 0

 

女士                                     男士

 

P(s1)                                  P(m2)

P(m1)                                 送花

收花                                    V(s1)

送表                                    P(s2)

V(s2)                                  手表

V(m1)                                 V(m2)

恋爱                                    恋爱

 

(2)自己的答案

四个分别是李四(男),张三(男),嘻嘻(女),哈哈(女)

信号量:

g1:是否有表收 :0

g2:是否有玫瑰收:0

s1:是否可以送表:1

s2:是否可以送玫瑰:1

note:这里只运行一次的,不能够循环

李四                               张三                               嘻嘻                               哈哈

P(s2)                             P(s2)                            P(s1)                             P(s1)     

sendRose()                   sendRose                     sendWatch                   sendWath

V(g2)                             V(g2)                            V(g1)                            V(g1)

P(g1)                             P(g1)                            P(g2)                            P(g2)

getWatch                      getWatch                     getRose                        getRose

V(s1)                             V(s1)                            V(s2)                             V(s2)

 

ps:这个解答我逻辑上想了一下,没有错误,但我一个同学说实际上载机器上跑时好像有问题,自己就没想明白,请高手指教了

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(信号量(三) 经典例题(二))