IPC 哲學家就餐問題(併發與互斥)

2022-04-06 01:07:53 字數 1417 閱讀 4792

哲學家就餐問題描述:

5個哲學家,5個筷子。5個哲學家圍坐在一張桌子上,筷子放在分別放在每個哲學家的兩旁。如果所有哲學家在某個時刻同時拿起左邊的筷子,那麼右邊的筷子就都被其他的哲學家拿了,造成大家都無法吃飯。但是大家都不想放下左邊的筷子(規則是先拿起左邊筷子在拿起右邊的,吃完飯在放下兩個筷子),這就是死鎖。

解決這個問題有個辦法是

在拿起筷子前先判斷左右兩個筷子是否可用,可用才能拿,而且是同時拿,這樣不相鄰的哲學家就可以吃上飯,不會造成死鎖。

實現**如下

#include #include #include #include #include #include union semun ;            //用於設定訊號量所需要的聯合體

int semid;

int sem_del(int semid) //刪除乙個訊號量集

void wait_for_2fork(int no)

,}; //-1表示為p操作

semop(semid,buf,2); //等待獲取刀叉(資源) }

void free_2fork(int no)

,}; //-1表示為p操作

semop(semid,buf,2); //釋放獲取的刀叉(資源) }

void phliosophere(int no) }

int main()

union semun su;

su.val=1;

int i;

for(i=0;i<5;i++)

semctl(semid,i,setval,su); //初始化訊號量

int no=0; //程序id

pid_t pid;

for(i=0;i<5;i++)

if(pid==0) //子程序

}phliosophere(no); //哲學家行為實現

return 0;

}

新問題描述:

設有5個哲學家,共享一張放有5把椅子的桌子,每人分得一把椅子,但是,桌子上共有5只筷子,在每人兩邊各放乙隻,哲學家們在肚子飢餓時才試圖分兩次從兩邊拿起筷子就餐。

條件:1)拿到兩隻筷子時哲學家才開始吃飯。

2)如果筷子已在他人手上,則該哲學家必須等他人吃完之後才能拿到筷子。

3)任一哲學家在自己未拿到兩隻筷子前卻不放下自己手中的筷子。

試:1)描述一 個保證不會出現兩個鄰座同時要求吃飯的通訊演算法。

2)描述乙個即沒有兩個鄰座同時吃飯,有沒有餓死(永遠拿不到筷子)的演算法

見參考2

參考:用訊號量解決哲學家就餐問題    

作業系統併發和互斥:哲學家進餐問題    

哲學家就餐問題linux下c++**      

哲學家就餐問題 互斥鎖

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

哲學家就餐問題

本文是哲學家就餐問題在 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...