哲學家就餐問題學習筆記

2021-08-21 11:33:26 字數 970 閱讀 6950

場景:5個哲學家,5根筷子,5盤義大利面(義大利面很滑,需要同時兩根筷子才能夾起來)大家圍繞桌子,進行思考與進食的活到,如下圖所示。

哲學家的活動描述:

哲學家除了吃麵,還要思考,所以要麼放下左右手筷子進行思考,要麼拿起兩根筷子開始吃飯(哲學家只能拿自己兩側的筷子吃麵,不考慮衛生問題,要不兩側的都拿起來吃麵,要麼就不拿,處於思考狀態。吃麵和思考其實是交替進行的)。

如何安排哲學家們一致的行動邏輯,保證他們至少有人且盡可能兩個人能同時拿到兩把叉子開始吃飯,而不會發生「死鎖」,「飢餓」,「幹等」的狀態。這是我們需要考慮的問題。

怎樣有比較好的、公平的方法解決哲學家吃義大利面的問題呢?

解決方法:

方法一:

至多只允許四位哲學家同時去拿左筷子,最終能保證至少有一位哲學家能進餐,並在用完後釋放兩隻筷子供他人使用。

設定乙個初值為 4 的訊號量 r,只允許 4 個哲學家同時去拿左筷子,這樣就能保證至少有乙個哲學家可以就餐,不會出現餓死和死鎖的現象。

方法二:

定奇數號哲學家先拿左筷子再拿右筷子,而偶數號哲學家相反。

原理:按照下圖,將是 2,3 號哲學家競爭 3 號筷子,4,5 號哲學家競爭 5 號筷子。1 號哲學家不需要競爭。最後總會有乙個哲學家能獲得兩支筷子而進餐。

哲學家就餐問題

本文是哲學家就餐問題在 linux 上的程式實現,與windows 平台的實現類似,程式上稍有不同。philosopherdining.cpp include include include include include include rasutil.h using namespace std ...

哲學家就餐問題

pragma once include include include include include include include include include include include include include stdafx.h handle chopstick 5 room l...

哲學家就餐問題

假設有五位哲學家圍坐在一張圓形餐桌旁,做以下兩件事情之一 吃飯,或者思考。吃東西的時候,他們就停止思考,思考的時候也停止吃東西。餐桌中間有一大碗義大利面,每兩個哲學家之間有乙隻餐叉。因為用乙隻餐叉很難吃到義大利面,所以假設哲學家必須用兩隻餐叉吃東西。他們只能使用自己左右手邊的那兩隻餐叉。哲學家就餐問...