2015-11-25 77 views
1

我工作的進程同步,與游泳池問題的改進版本:信號燈:增強的游泳池

泳客想去游泳池:

  • 他們不得不採取一個空籃子
  • 他們有一個免費的小隔間
  • 他們把自己的泳裝去,把自己的衣服的籃子和離開隔間
  • 他們游泳
  • 他們將回到一個自由櫃與他們的籃子
  • 他們把自己的衣服回來,並離開隔間
  • 他們給空筐回
  • 有籃子的次數有限,隔間
  • 如果入浴不能找到一個空籃子或免費的小隔間,他會等到一個可用

改進版本:

  • 有成員和非成員
  • 成員擁有優先於非會員
  • 如果一個資源變爲可用時,它會給予一個等待成員,如果有不是,它會給予任何人在等。

要做到這一點,我想我會用3個信號量:一個籃子,一個用於隔間,和一個用於等待的成員。這樣,當一個成員等待時,信號量會阻止任何調用P(s_members)的進程,並且當一個成員最終得到一個籃子時,他調用V(s_members)。但是隊列中可能有多個成員在等待,每次調用V(s_members)時,信號量都不應該「釋放」非成員。這就是爲什麼我認爲sembuf.sem_op = 0;將是一個很好的協議,因爲非成員將不得不等待0
的問題是,這種解決方案:

  • 非成員必須調用P(s_basket)P(s_cubicle)之前調用P(s_members)
  • 非會員必須呼叫P(s_members)才能入睡並與其他人排隊,但他們不需要增加/減少信號量的值,因爲它不依賴於它們。
  • 等待資源的成員需要呼叫P(s_members)以增加/減少其值(因爲他們在隊列中),但他們不需要入睡並繼續等待他們的籃子。
  • 設想一下這種情況:一名非會員正在等待他的籃子,目前隊列中沒有成員。然後,一位成員出現,顯然他也在等待資源。此時,正在等待的非會員應該睡着,直到會員離開隊列,但他們已經在睡覺等待他們的籃子,這意味着他們已經叫P(s_members)。因此,優先規則不適用。

我們該如何解決?
我希望它很清楚,很難解釋和容易搞砸所有。 謝謝你的閱讀時間。

編輯:
很抱歉,如果我張貼這種在錯誤的StackExchange社會,我會在下一次三思而後行!

+0

設計代碼不是stackoverflow的工作,它不是執行問題場景分析的stackoverflow的工作。我們在這裏回答兩種問題1)爲什麼它不能編譯?2)爲什麼產生了錯誤的輸出?在任何一種情況下,您都必須發佈您的代碼,並在第一種情況下指出沒有編譯的內容。第二種情況是在輸入,預期產出和實際產出後。一般來說,沒有代碼,沒有幫助。我們不會爲你做你的功課。 – user3629249

+0

謝謝你的幫助。 – qreon

回答

2

想象一下這種情況:非會員正在等待他的購物籃,並且 目前在隊列中沒有成員。然後,一位成員出現,顯然,他也在等待資源。此時,正在等待的非會員應該睡着,直到成員 離開隊列,但他們已經睡着了等待他們的 籃子,這意味着他們已經呼叫了P(s_members)。因此, 優先規則不適用。

所以你的意思是「如果一個非會員與成員一起睡在同一隊列中,我們就被搞砸了」。我同意。一旦非會員進入隊列中睡覺,你不能在之後將它們完全抽出。

由於非成員和成員不能等待同一信號量上的資源,所以s_basket必須是錯誤的。

如何嘗試s_basket_memberss_basket_nonmembers

我相信你也需要跟蹤幾個int s,比如有多少成員/非成員在等待,以及有多少籃子可用。

+0

我會嘗試一下,我有一些想法,謝謝你的提示:-) – qreon