国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

用C#模擬“嗜睡的理發師”問題

2019-11-17 04:05:35
字體:
來源:轉載
供稿:網友
       近日,一直在思考操作系統老師留給我們的一個進程同步問題。

        問題是這樣的:一個理發店由一個有N張沙發的等待室和一個放有一張理發椅的理發室組成。沒有顧客要理發時,理發師便去睡覺。當一個顧客走進理發店時,如果所有的沙發都已被占用,他便離開理發店;否則,如果理發師正在為其他顧客理發,則該顧客就找一張空沙發坐下等待;如果理發師因無顧客正在睡覺,則由新到的顧客喚醒理發師為其理發。在理發完成后,顧客必須付費,直到理發師收費后才能離開理發店。試用信號量實現這一同步問題。并編寫一程序進行模擬。

        因為剛學過進程管理這一內容。用信號量實現并不困難。

        分析可知:顧客進程和理發師進程之間存在著多種同步關系:

        (1)只有在理發椅空閑時,顧客才能坐到理發椅上等待理發師理發,否則顧客便必須等待;只有當理發椅上有顧客時,理發師才可以開始理發,否則他也必須等待。這種同步關系類似于單緩沖(對應于理發椅)的生產者——消費者問題中的同步關系,故可通過信號量empty和full來控制。

        (2)顧客理完發后必須向理民師付費,并等理發師收費后才能離開,而理發師則需等待顧客付費,并在收費后通知顧客離開,這可分別通過兩個信號量payment和receipt來控制。

        (3)等候室中N張沙發是顧客進程競爭的資源,故還需要為它們設置一個資源信號量sofa。

        (4)為了控制顧客人數,使顧客能在所有的沙發都被占用時離開理發店,還必須設置玫個整型變量count來外處理理發店中的顧客進行計數,該變量將被多個顧客進程互斥地訪問并修改,這可通過一個互斥信號量mutex來實現。

        所以為解決這一問題,需要設置一個整型變量count用來對理發店中的顧客進行計數,并需設置6個信號量。其中:mutex用來實現顧客進程對count變量的互斥訪問,其初值為1;sofa是對應于等待室中N張沙發的資源信號量,其初值為N;empty表示是否空閑的理發椅,其初值為1;full表示理發椅上是否坐有等待理發的顧客,其初值為0;payment用業等待付費,其初值為0;receipt用來等待收費,其初值為0;具體的算法描述如下:

        var count:iteger=0;

                mutex,sofa,empty,full:semaphore:=1,N,1,0;

                cut,payment,receipt:semaphore:=0,0,0;

        begin

            parbegin

                guest:begin

                                  wai(mutex);

                                  if(count>N) then

                                  begin

                                      signle(mutex);

                                      離開理發店;

                                  end

                                  else

                                  begin

                                      count:=coun+1;

                                      if(count>1) then

                                      begin

                                          wait(sofa);

                                          在沙發中就坐;

                                          wait(empty);

                                          從沙發上起來;

                                          signal(sofa);

                                      end

                                      else /* count=1 */

                                          wait(emPRy);

                                      在理發椅上就坐;

                                      sinal(full);

                                      理發;

                                      付費;

                                      sinal(payment);

                                      wait(receipt);

                                      從理發椅上起來;

                                      signal(empty);

                                      wait(mutex);

                                      count:=count-1;

                                      signal(mutex);

                                      離開理發店;

                                  end

                          end

                barber:begin

                                  repeat

                                      wait(full);

                                      替顧客理發;

                                      wait(payment);

                                      收費;

                                      sinal(receipt);

                                  untile false;

                            end

          parend

        end

        算法出來了,但現在問題是如何用程序來模擬呢?

        因為我們對C#語言比較熟悉,所以首先想到設計一個windows應用程序來模擬。在C#中命各空間System.Threading定義了許多有關線程同步和互斥的類和方法。但具體該怎樣使用我還不得要領,思考中……
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 梁河县| 长沙县| 河西区| 株洲县| 卢湾区| 类乌齐县| 辰溪县| 故城县| 安岳县| 青阳县| 新龙县| 巩留县| 博客| 抚顺市| 郎溪县| 吉林市| 二连浩特市| 岳普湖县| 三门峡市| 禹州市| 诸暨市| 峨边| 湖口县| 宽城| 海安县| 长顺县| 交城县| 永兴县| 延津县| 荔波县| 合山市| 河东区| 楚雄市| 通江县| 上饶县| 稷山县| 万山特区| 阿尔山市| 荥经县| 长沙市| 甘肃省|