秒殺多線程-PV操作
PV操作由P操作原語(yǔ)和V操作原語(yǔ)組成(原語(yǔ)也叫原子操作Atomic Operation,是不可中斷的過(guò)程),對(duì)信號(hào)量(注意不要和Windows中的信號(hào)量機(jī)制相混淆)進(jìn)行操作,具體定義如下:
P(S):
1.將信號(hào)量S的值減1,即S=S-1;
2.如果S>=0,則該進(jìn)程繼續(xù)執(zhí)行;否則該進(jìn)程置為等待狀態(tài)。
V(S):
1.將信號(hào)量S的值加1,即S=S+1;
2.該進(jìn)程繼續(xù)執(zhí)行;如果該信號(hào)的等待隊(duì)列中有等待進(jìn)程就喚醒一等待進(jìn)程。
用PV操作實(shí)現(xiàn)多線程的同步與互斥是非常簡(jiǎn)單的,只要考慮邏輯處理上合理嚴(yán)密而不用考慮具體技術(shù)細(xì)節(jié),因此與寫偽代碼較為相似。比如有多個(gè)進(jìn)程P1、P2、 ……PN。它們要互斥的訪問(wèn)一個(gè)資源。用PV操作來(lái)實(shí)現(xiàn)就非常方便直觀。下面是PV操作代碼:
設(shè)置信號(hào)量為S,初值為1。各進(jìn)程的操作流程如下:
進(jìn)程P1
P(S);
訪問(wèn)資源;
V(S);
進(jìn)程P2
P(S);
訪問(wèn)資源;
V(S);
...
進(jìn)程Pn
P(S);
訪問(wèn)資源;
V(S);
可以看出PV操作會(huì)忽略具體的編程細(xì)節(jié),讓程序員的主要精力放在線程同步互斥的邏輯處理上。因此,通過(guò)練習(xí)PV操作能快速有效提高程序員對(duì)多線程的邏輯思維能力,達(dá)到強(qiáng)化“內(nèi)功”的目的。
放水果
桌上有一空盤,允許存放一個(gè)水果。爸爸可向盤中放蘋果,也可向盤中放桔子,兒子專等吃盤中的桔子,女兒專等吃盤中的蘋果。規(guī)定當(dāng)盤空時(shí)一次只能放一個(gè)水果供吃者取用,請(qǐng)用P、V原語(yǔ)實(shí)現(xiàn)爸爸、兒子、女兒三個(gè)并發(fā)進(jìn)程的同步。
分析問(wèn)題:
1.爸爸等待盤子空
2.兒子等待盤中水果是桔子
3.女兒等待盤中水果是蘋果
可以看出沒(méi)有互斥資源。先設(shè)置三個(gè)信號(hào)量,信號(hào)量Orange
表示盤中有桔子,初值為0。信號(hào)量Apple
表示盤中有蘋果,初值為0。信號(hào)量EmptyDish
表示盤子為空,初值為1。三個(gè)人的操作流程如下所示:
1.爸爸
2.兒子
3.女兒

安全島
在南開(kāi)大學(xué)至天津大學(xué)間有一條彎曲的路,每次只允許一輛自行車通過(guò),但中間有小的安全島M(同時(shí)允許兩輛車),可供兩輛車在已進(jìn)入兩端小車錯(cuò)車,設(shè)計(jì)算法并使用P,V實(shí)現(xiàn)。

1.從N到T出發(fā)的人需要等到上個(gè)出發(fā)的人到達(dá)T且道路K上沒(méi)有人,從T到N的也類似
分析之后,下面就用PV原語(yǔ)給出答案(考研輔導(dǎo)書上的答案):
這個(gè)題目的解法有很多,比如還可以用信號(hào)量M來(lái)記錄安全島M上空位個(gè)數(shù),初值為2。每個(gè)進(jìn)入道路前的人都要先預(yù)訂安全島上的空位,訂到后再互斥的進(jìn)入道路。否則就要等待安全島上有空位。信號(hào)量K和L表示道路,初值均為1。然后從N到T的車和從T到N的車的行駛流程如下:
參考:https://blog.csdn.net/morewindows/article/details/7650470