秒杀多线程第十二篇 多线程同步内功心法——PV操作上
閱讀本篇之前推薦閱讀以下姊妹篇:
《秒殺多線程第四篇一個(gè)經(jīng)典的多線程同步問題》
《秒殺多線程第五篇經(jīng)典線程同步關(guān)鍵段CS》
《秒殺多線程第六篇經(jīng)典線程同步事件Event》
《秒殺多線程第七篇經(jīng)典線程同步互斥量Mutex》
《秒殺多線程第八篇經(jīng)典線程同步信號(hào)量Semaphore》
《秒殺多線程第九篇經(jīng)典線程同步總結(jié)關(guān)鍵段事件互斥量信號(hào)量》
《秒殺多線程第十篇生產(chǎn)者消費(fèi)者問題》
《秒殺多線程第十一篇讀者寫者問題》
?
上面的文章講解了在Windows系統(tǒng)下實(shí)現(xiàn)多線程同步互斥的方法,為了提高在實(shí)際問題中分析和思考多個(gè)線程之間同步互斥問題的能力,接下來將講解PV操作,這也是操作系統(tǒng)中的重點(diǎn)和難點(diǎn)。本文將會(huì)先簡要介紹下PV操作的來源和基本使用方法,然后再通過兩道經(jīng)典的計(jì)算機(jī)考研真題——放水果和安全島來示范如何運(yùn)用PV操作。
?
先講講PV操作的起源和用法。
1962年,荷蘭學(xué)者Dijksrta在參與X8計(jì)算機(jī)的開發(fā)中設(shè)計(jì)并實(shí)現(xiàn)了具有多道程序運(yùn)行能力的操作系統(tǒng)——THE Multiprogramming System。為了解決這個(gè)操作系統(tǒng)中進(jìn)程(線程)的同步與互斥問題,他巧妙地利用火車運(yùn)行控制系統(tǒng)中的“信號(hào)燈”(semaphore,或叫“信號(hào)量”)概念加以解決。信號(hào)量的值大于0時(shí),表示當(dāng)前可用資源的數(shù)量;當(dāng)它的值小于0時(shí),其絕對值表示等待使用該資源的進(jìn)程個(gè)數(shù)。注意,這個(gè)信號(hào)量的值僅能由PV操作來改變。
PV操作由P操作原語和V操作原語組成(原語也叫原子操作Atomic Operation,是不可中斷的過程),對信號(hào)量(注意不要和Windows中的信號(hào)量機(jī)制相混淆)進(jìn)行操作,具體定義如下:
P(S):
①將信號(hào)量S的值減1,即S=S-1;
②如果S>=0,則該進(jìn)程繼續(xù)執(zhí)行;否則該進(jìn)程置為等待狀態(tài)。
V(S):
①將信號(hào)量S的值加1,即S=S+1;
②該進(jìn)程繼續(xù)執(zhí)行;如果該信號(hào)的等待隊(duì)列中有等待進(jìn)程就喚醒一等待進(jìn)程。
?
用PV操作實(shí)現(xiàn)多線程的同步與互斥是非常簡單的,只要考慮邏輯處理上合理嚴(yán)密而不用考慮具體技術(shù)細(xì)節(jié),因此與寫偽代碼較為相似。比如有多個(gè)進(jìn)程P1、P2、 ……PN。它們要互斥的訪問一個(gè)資源。用PV操作來實(shí)現(xiàn)就非常方便直觀。下面是PV操作代碼:
設(shè)置信號(hào)量為S,初值為1。各進(jìn)程的操作流程如下:
進(jìn)程P1??????????????進(jìn)程P2?????????? ……??????????進(jìn)程Pn
P(S);????????????? P(S);????????????? ??????????? ?P(S);
訪問資源;?????????訪問資源;??????????????????????訪問資源;
V(S);???????????? V(S);??????????????????????? ??V(S);
可以看出PV操作會(huì)忽略具體的編程細(xì)節(jié),讓程序員的主要精力放在線程同步互斥的邏輯處理上。因此,通過練習(xí)PV操作能快速有效提高程序員對多線程的邏輯思維能力,達(dá)到強(qiáng)化“內(nèi)功”的目的。
?
接下來就來幾道簡單的計(jì)算機(jī)考研真題。
?
第一題 放水果 南京大學(xué)計(jì)算機(jī)考研真題
桌上有一空盤,允許存放一只水果。爸爸可向盤中放蘋果,也可向盤中放桔子,兒子專等吃盤中的桔子,女兒專等吃盤中的蘋果。規(guī)定當(dāng)盤空時(shí)一次只能放一只水果供吃者取用,請用P、V原語實(shí)現(xiàn)爸爸、兒子、女兒三個(gè)并發(fā)進(jìn)程的同步。
這個(gè)題目涉及的東西非常之多,光人物就有三個(gè)再加水果,盤子等等,確實(shí)讓人感覺好像無從下手。但不管題目如何變,只要牢牢的抓住同步和互斥來分析問題就必定能迎刃而解。
下面先考慮同步情況即所有“等待”情況:
第一.爸爸要等待盤子為空。
第二.兒子要等待盤中水果是桔子。
第三.女兒要等待盤中水果是蘋果。
接下來來考慮要互斥處理的資源,看起來盤子好像是要作互斥處理的,但由于題目中的爸爸、兒子、女兒均只有一個(gè),并且他們訪問盤子的條件都不一樣,所以他們根本不會(huì)同時(shí)去訪問盤子,因此盤子也就不用作互斥處理了。分析至些,這個(gè)題目已經(jīng)沒有難度了,下面用PV原語給出答案:
先設(shè)置三個(gè)信號(hào)量,信號(hào)量Orange表示盤中有桔子,初值為0。信號(hào)量Apple表示盤中有蘋果,初值為0。信號(hào)量EmptyDish表示盤子為空,初值為1。三個(gè)人的操作流程如下所示:
1.爸爸
P(EmptyDish)
if (rand()%2==0)
{???
??? 放桔子
??? V(Orange)
}
else
{
??? 放蘋果
?? ?V(Apple)
}
?
2.兒子
P(Orange)
取桔子
V(EmptyDish)
?
3.女兒
P(Apple)
取蘋果
V(EmptyDish)
?
?
第二題 安全島 南開大學(xué)考研真題
在南開大學(xué)至天津大學(xué)間有一條彎曲的路,每次只允許一輛自行車通過,但中間有小的安全島M(同時(shí)允許兩輛車),可供兩輛車在已進(jìn)入兩端小車錯(cuò)車,設(shè)計(jì)算法并使用P,V實(shí)現(xiàn)。
這個(gè)問題應(yīng)該如何考慮了?同樣只要牢牢的抓住同步和互斥來分析問題就必定能迎刃而解。
考慮所有“等待”情況:
在路口N準(zhǔn)備從N到T的人應(yīng)該什么時(shí)候進(jìn)入了?如果他只判斷道路K上有沒有人肯定是不行的,因?yàn)槿绻踩珝uM上已經(jīng)有2個(gè)人,那么路口N和路口T再各進(jìn)一人,肯定會(huì)造成死鎖。因此可以這樣——在路口N準(zhǔn)備從N到T的人要等待與他同方向的人已經(jīng)到達(dá)T,如果此人已經(jīng)到達(dá)T,且道路K上沒有人,他必定可以上路了。同理在路口T準(zhǔn)備從T到N的人也應(yīng)該這樣做。
再考慮互斥情況:
路上每次只允許一輛自行車通過,所以道路是需要作互斥處理的。
?
分析之后,下面就用PV原語給出答案(考研輔導(dǎo)書上的答案):
設(shè)置信號(hào)量NT表示在路口N且從N到T方向上允許出發(fā)的自行車數(shù)量,初值為1。信號(hào)量TN表示在路口T且從T到N方向上允許出發(fā)的自行車數(shù)量,初值為1。信號(hào)量K和L表示道路,初值均為1。這樣從N到T的車和從T到N的車的行駛流程如下:
從N到T的車?????? ??????????????從T到N的車
P(NT)??????????????? P(TN)
P(K)???????????????? P(L)
由N到M???????????????由T到M
V(K)?????????????????V(L)
P(L)?????????????????P(K)
由M到T???????????????由M到T
V(L)?????????????????V(K)
V(NT)????????????????V(TN)
?
這個(gè)題目的解法有很多,比如還可以用信號(hào)量M來記錄安全島M上空位個(gè)數(shù),初值為2。每個(gè)進(jìn)入道路前的人都要先預(yù)訂安全島上的空位,訂到后再互斥的進(jìn)入道路。否則就要等待安全島上有空位。信號(hào)量K和L表示道路,初值均為1。然后從N到T的車和從T到N的車的行駛流程如下:
從N到T的車?????????????????????從T到N的車
P(M)???????????????? P(M)
P(K)?????????????????P(L)
由N到M???????????????由T到M
V(K)?????????????????V(L)
P(L)?????????????????P(K)
V(M)?????????????????V(M)
由M到T???????????????由M到T
V(L)?????????????????V(K)
?
這種解決方法也是不會(huì)造成死鎖的。安全島的解法非常之多,網(wǎng)上還有不少不同的解法,有興趣的童鞋可以搜索一下。
?
下一篇《秒殺多線程第十三篇多線程同步內(nèi)功心法——PV操作下》將講解更難的一道PV操作題,歡迎大家參閱。
總結(jié)
以上是生活随笔為你收集整理的秒杀多线程第十二篇 多线程同步内功心法——PV操作上的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 秒杀多线程第十一篇 读者写者问题
- 下一篇: 秒杀多线程第十篇 生产者消费者问题