多生产者-多消费者问题
生活随笔
收集整理的這篇文章主要介紹了
多生产者-多消费者问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1 問題描述
- 2 問題分析
- 3 代碼實現
- 4 分析總結
1 問題描述
桌子上有一只盤子,每次只能向其中放入一個水果。爸爸專向盤子中放蘋果,媽媽專向盤子中放橘子,兒子專等著吃盤子中的橘子,女兒專等著吃盤子中的蘋果。只有盤子空時,爸爸或媽媽才可向盤子中放一個水果。僅當盤子中有自己需要的水果時,兒子或女兒可以從盤子中取出水果。
2 問題分析
多生產者-多消費者問題關系分析如下:
互斥關系: 對緩沖區(盤子)的訪問要互斥地進行
同步關系(一前一后):
注意:“盤子為空”這個事件可以由兒子或女兒觸發,事件發生后才允許父親或母親放水果
由以上的同步、互斥關系分析,將多生產者-多消費者問題描繪出圖形:
(互斥信號量初值一般為 1,同步信號量的初始值要看對應資源的初始值是多少)
本問題中信號量設置如下:
dad:先準備一個蘋果,放蘋果之前,先判斷盤子里是否為空(P一下盤子,檢查盤子中還可以放多少個水果),然后再將蘋果放入進去(V一下蘋果,數量+1)
mom:先準備一個橘子,放橘子之前,先判斷盤子里是否為空(P一下盤子,檢查盤子中還可以放多少個水果),然后再將橘子放入進去(V一下橘子,數量+1)
daughter:拿蘋果之前,先判斷盤子里有沒有蘋果(P一下蘋果,若沒有蘋果,自己被阻塞),然后告訴父母,盤子為空了(V一下盤子)
son:拿橘子之前,先判斷盤子里有沒有橘子(P一下橘子,若沒有橘子,自己被阻塞),然后告訴父母,盤子為空了(V一下盤子)
以下實現了所有進程之間的同步關系:
還需要實現各個進程對盤子(緩沖區)的互斥訪問:
就是所有進程對盤子進行PV操作,即加鎖和解鎖的過程
3 代碼實現
semaphore mutex = 1; //實現互斥訪問盤子(緩沖區)semaphore apple = 0; //盤子中有幾個蘋果 semaphore orange = 0; //盤子中有幾個橘子semaphore plate = 1; //盤子中還可以放多少個水果dad (){while(1){準備一個蘋果;P(plate);P(mutex);向盤子中放蘋果;V(mutex);V(apple); //允許女兒進程取蘋果} } mom (){while(1){準備一個橘子;P(plate);P(mutex);向盤子中放橘子;V(mutex);V(orange); //允許兒子進程取橘子} } daughter (){while(1){P(apple);P(mutex);從盤子中取出蘋果;V(mutex);V(plate); //允許父母進程進程向盤子中取放水果吃蘋果;} } son (){while(1){P(orange);P(mutex);從盤子中取出橘子;V(mutex);V(plate); //允許父母進程進程向盤子中取放水果吃橘子;} }4 分析總結
結論:即使不設置專門的互斥變量mutex,也不會出現多個進程同時訪問盤子的現象
原因在于:本題中的緩沖區大小為1,在任何時刻,apple、orange、plate三個同步信號量中最多只有一個是1。因此在任何時刻, 最多只有一個進程的P操作不會被阻塞,并順利地進入臨界區…
父親P(plate),可以訪問盤子→母親P(plate),可以訪問盤子→父親在往盤子里放蘋果,同時母親也可以往盤子里放橘子。于是就出現了兩個進程同時訪問緩沖區的情況,有可能導致兩個進程寫入緩沖區的數據相互覆蓋的情況。
因此,如果緩沖區大小大于1,就必須專門設置一個互斥信號量mutex來保證互斥訪問緩沖區。
理解理清復雜的同步關系:
在分析同步問題(一前一后問題)的時候不能從單個進程行為的角度來分析,要把“一前一后”發生的事看做是兩種“事件”的前后關系。
比如,如果從單個進程行為的角度來考慮的話,我們會有以下結論:
正確的分析方法應該從“事件”的角度來考慮
我們可以把上述四對“進程行為的前后關系”抽象為 一對“事件的前后關系”
總結
以上是生活随笔為你收集整理的多生产者-多消费者问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tensorflow3 非线性回归、mn
- 下一篇: 中文实体、关系抽取工具