1. 程式人生 > >The Little Book of Semaphores 訊號量小書 第五章 稍欠經典的同步問題 5.1 野蠻人進餐問題

The Little Book of Semaphores 訊號量小書 第五章 稍欠經典的同步問題 5.1 野蠻人進餐問題

第五章 稍欠經典的同步問題

5.1 野蠻人進餐問題

這個問題來自安德魯斯的併發程式設計[1]。

一個野蠻人部落從一個大鍋裡吃公共晚餐,大鍋可以容納大量的燉傳教士。【這個問題是基於對狩獵 - 採集社會中西方傳教士歷史的卡通化表現。 一些幽默的意圖是針對哲學家進餐的問題,但這裡的“野蠻人”的表現並不是為了比以前的哲學家的表現更為現實。 如果你對狩獵 - 採集社會感興趣,我推薦Jared Diamond的《Guns, Germs and Steel》,Napoleon Chagnon的《The Yanomamo》,以及Redmond O'Hanlon的《In Trouble Again》,但不推薦Tierney的《Darkness in El Dorado》,我認為這是不可信的。】當一個野蠻人想吃東西時,他會幫助自己從鍋中解脫,除非它是空的。 如果鍋是空的,野蠻人將廚師吵醒,然後等到廚師重新裝滿鍋。

任意數量的野蠻人執行緒都執行以下程式碼:

一個廚師執行緒執行此程式碼:

同步約束是:

  • 如果鍋底為空,野蠻人無法呼叫getServingFromPot。
  • 只有在鍋為空時,廚師才能呼叫putServingsInPot。

思考:為野蠻人和廚師新增滿足同步約束的程式碼。

5.1.1 野蠻人進餐問題提示

很容易使用訊號量來跟蹤食物的數量,就像生產者 - 消費者問題一樣。 但是為了在鍋為空時向廚師發出訊號,執行緒必須在遞減訊號量之前知道它是否必須等待,而我們就是不能這樣做。

另一種方法是使用記分板來跟蹤食物的數量。 如果一個野蠻人發現計數器為零,他會喚醒廚師並等待鍋已滿的訊號。 以下是我使用的變數:

毫不奇怪,emptyPot表示鍋是空的,而fullPot表示鍋已滿。

5.1.1 野蠻人進餐問題方案

我的解決方案是記分牌模式與集合點的組合。 這是廚師的程式碼:

野蠻人的程式碼只是稍微複雜一點。 當每個野蠻人通過互斥體時,他會檢查鍋。 如果它是空的,他會向廚師發出訊號並等待。 否則,他減少了servings並從鍋中獲得了一份食物。

未完待續。。。