哲學家就餐問題

2021-08-09 15:28:41 字數 1157 閱讀 6457

/*

* 問題描述:哲學家就餐

* c/c++ 語言

** @author erice_s

* [email protected]

* @date 2017/10/21**/

#include

#include

#include

#include

#define max 5 // 五個哲學家

#define left (i+max-1)%max //佇列處理 左邊的哲學家

#define right (i+1)%max // 右邊的哲學家

enum state[max];

pthread_mutex_t mutex=pthread_mutex_initializer,s[max]; //每個哲學家乙個互斥量

void test(int i) }

void take_fork(int i) // 第 i 號哲學家拿叉子

void put_fork(int i) // 第 i 號哲學家放叉子

void thinking(int i)

void *dothing(void *p) // 五個哲學家開始拿叉子

}int main(void)

**思想分析 :

上面的**中,當哲學家飢餓的時候他會去拿他周圍兩邊的叉子,當執行成功後便可以就餐。之後他放下叉子,通知周圍兩個人他放下了叉子。上面的**可以保證不會有兩個相鄰的哲學家同時進餐。

避免死鎖的解法 :

(1)至多允許有四個哲學家同時拿左邊的叉子,最終能保證至少有一位哲學家能夠進餐,並在其用畢時能釋放兩隻叉子,從而使更多的哲學家能夠吃飯。

(2)僅當哲學家的左右兩隻叉子都可以用時才允許他去吃飯。

(3)規定奇數號哲學家先拿起左邊的叉子,然後再去拿右邊的叉子;而偶數號哲學家相反。按照此規定,1,2號哲學家競爭1 號叉子;3,4號哲學家競爭3號叉子。五位哲學家都先競爭奇數號叉子,獲得後,再去競爭偶數號叉子,最後總會有乙個哲學家能獲得兩隻叉子而吃飯。

哲學家就餐問題

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

哲學家就餐問題

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