阿里巴巴|阿里技術三面:哲學家進餐

阿里巴巴|阿里技術三面:哲學家進餐

文章圖片

阿里巴巴|阿里技術三面:哲學家進餐

文章圖片

阿里巴巴|阿里技術三面:哲學家進餐

文章圖片

阿里巴巴|阿里技術三面:哲學家進餐

哲學家進餐5個沉默寡言的哲學家圍坐在圓桌前 , 每人面前一盤意面 。 叉子放在哲學家之間的桌面上 。 (5 個哲學家 , 5 根叉子)
所有的哲學家都只會在思考和進餐兩種行為間交替 。 哲學家只有同時拿到左邊和右邊的叉子才能吃到面 , 而同一根叉子在同一時間只能被一個哲學家使用 。 每個哲學家吃完面后都需要把叉子放回桌面以供其他哲學家吃面 。 只要條件允許 , 哲學家可以拿起左邊或者右邊的叉子 , 但在沒有同時拿到左右叉子時不能進食 。
假設面的數量沒有限制 , 哲學家也能隨便吃 , 不需要考慮吃不吃得下 。
設計一個進餐規則(并行算法)使得每個哲學家都不會挨餓;也就是說 , 在沒有人知道別人什么時候想吃東西或思考的情況下 , 每個哲學家都可以在吃飯和思考之間一直交替下去 。

哲學家從 0 到 4 按順時針編號 。
【阿里巴巴|阿里技術三面:哲學家進餐】請實現函數 wantsToEat(philosopher pickLeftFork pickRightFork eat putLeftFork putRightFork):

  • philosopher 哲學家的編號 。
  • pickLeftFork 和 pickRightFork 表示拿起左邊或右邊的叉子 。
  • eat 表示吃面 。
  • putLeftFork 和 putRightFork 表示放下左邊或右邊的叉子 。
  • 由于哲學家不是在吃面就是在想著啥時候吃面 , 所以思考這個方法沒有對應的回調 。
給你 5個線程 , 每個都代表一個哲學家 , 請你使用類的同一個對象來模擬這個過程 。 在最后一次調用結束之前 , 可能會為同一個哲學家多次調用該函數 。
示例輸入:n = 1
輸出:
[[421
[411
[011
[221
[211
[203
[212
[222
[403
[412
[021
[422
[321
[311
[003
[012
[022
[121
[111
[303
[312
[322
[103
[112
[122


解釋:
  • n 表示每個哲學家需要進餐的次數 。
  • 輸出數組描述了叉子的控制和進餐的調用 , 它的格式如下:output[i
    = [a b c
    (3個整數)
  • a 哲學家編號 。
  • b 指定叉子:{1 : 左邊 2 : 右邊.
  • c 指定行為:{1 : 拿起 2 : 放下 3 : 吃面 。
  • 如 [421
    表示 4 號哲學家拿起了右邊的叉子 。
解題思路這道題本質上其實是想考察如何避免死鎖 。
易知:當 5個哲學家都拿著其左邊(或右邊)的叉子時 , 會進入死鎖 。
死鎖的4個必要條件