日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多生产者-多消费者问题

發布時間:2024/7/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多生产者-多消费者问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

        • 1 問題描述
        • 2 問題分析
        • 3 代碼實現
        • 4 分析總結

1 問題描述

桌子上有一只盤子,每次只能向其中放入一個水果。爸爸專向盤子中放蘋果,媽媽專向盤子中放橘子,兒子專等著吃盤子中的橘子,女兒專等著吃盤子中的蘋果。只有盤子空時,爸爸或媽媽才可向盤子中放一個水果。僅當盤子中有自己需要的水果時,兒子或女兒可以從盤子中取出水果。

2 問題分析

  • 關系分析。找出題目中描述的各個進程,分析它們之間的同步、互斥關系。
    多生產者-多消費者問題關系分析如下:
  • 互斥關系: 對緩沖區(盤子)的訪問要互斥地進行
    同步關系(一前一后):

  • 父親將蘋果放入盤子后,女兒才能取蘋果
  • 母親將橘子放入盤子后,兒子才能取橘子
  • 只有盤子為空時,父親或母親才能放入水果
  • 注意:“盤子為空”這個事件可以由兒子或女兒觸發,事件發生后才允許父親或母親放水果

  • 整理思路。根據各進程的操作流程確定P、V操作的大致順序。
  • 由以上的同步、互斥關系分析,將多生產者-多消費者問題描繪出圖形:

  • 設置信號量。設置需要的信號量,并根據題目條件確定信號量初值。
    (互斥信號量初值一般為 1,同步信號量的初始值要看對應資源的初始值是多少)
    本問題中信號量設置如下:
  • semaphore mutex = 1; //實現互斥訪問盤子(緩沖區)semaphore apple = 0; //盤子中有幾個蘋果 semaphore orange = 0; //盤子中有幾個橘子semaphore plate = 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操作不會被阻塞,并順利地進入臨界區…
  • 若將緩沖區設置為2會發生什么現象?
    父親P(plate),可以訪問盤子→母親P(plate),可以訪問盤子→父親在往盤子里放蘋果,同時母親也可以往盤子里放橘子。于是就出現了兩個進程同時訪問緩沖區的情況,有可能導致兩個進程寫入緩沖區的數據相互覆蓋的情況。
  • 因此,如果緩沖區大小大于1,就必須專門設置一個互斥信號量mutex來保證互斥訪問緩沖區。

  • 總結:在生產者-消費者問題中,如果緩沖區大小為1,那么有可能不需要設置互斥信號量就可以實現 互斥訪問緩沖區的功能。當然,這不是絕對的,要具體問題具體分析。
  • 建議:在考試中如果來不及仔細分析,可以加上互斥信號量,保證各進程一定會互斥地訪問緩沖區。 但需要注意的是,實現互斥的P操作一定要在實現同步的P操作之后,否則可能引起“死鎖”。
  • 理解理清復雜的同步關系:
    在分析同步問題(一前一后問題)的時候不能從單個進程行為的角度來分析,要把“一前一后”發生的事看做是兩種“事件”的前后關系。

    比如,如果從單個進程行為的角度來考慮的話,我們會有以下結論:

  • 如果盤子里裝有蘋果,那么一定要女兒取走蘋果后父親或母親才能再放入水果
  • 如果盤子里裝有橘子,那么一定要兒子取走橘子后父親或母親才能再放入水果
  • 這么看是否就意味著要設置四個同步信號量分別實現這四個“一前一后”的關系了?
  • 正確的分析方法應該從“事件”的角度來考慮

    我們可以把上述四對“進程行為的前后關系”抽象為 一對“事件的前后關系”

  • 盤子變空事件→放入水果事件。“盤子變空事件”既可由兒子引發,也可由女兒引發;
  • “放水果事件” 既可能是父親執行,也可能是母親執行。
  • 這樣的話,就可以用一個同步信號量解決問題了
  • 總結

    以上是生活随笔為你收集整理的多生产者-多消费者问题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。