有五個哲學家繞著圓桌坐,每個哲學家面前有一盤面,兩人之間有一支筷子,這樣每個哲學家左右各有一支筷子。哲學家有2個狀態,思考或者拿起筷子吃飯。如果哲學家拿到乙隻筷子,不能吃飯,直到拿到2只才能吃飯,並且一次只能拿起身邊的一支筷子。一旦拿起便不會放下筷子直到把飯吃完,此時才把這雙筷子放回原處。如果,很不幸地,每個哲學家拿起他或她左邊的筷子,那麼就沒有人可以吃到飯了。
哲學家進餐問題是乙個多執行緒運用的經典例子,涉及到執行緒同步/互斥,臨界區訪問問題以及死鎖問題。
#include
#include
#include
#include
#include
#include
#include
#define n 5
sem_t chopsticks[n]
;//設定5種訊號量,有5種不同型別的資源,每一種有1個,這樣便於理解,因為每個哲學家需要的資源不同
pthread_mutex_t mutex;
//定義互斥鎖
int philosophers[n]=;
//代表5個哲學家的編號
void delay (
int len)
i--;}
}void
*philosopher (
void
* arg)
}int main (
int argc,
char
**ar**)
pthread_mutex_init
(&mutex,
null);
//初始化互斥鎖
//建立執行緒
for(
int i=
0; i)//掛起執行緒
for(
int i=
0; i)//銷毀訊號量
for(
int i=
0; i)pthread_mutex_destroy
(&mutex)
;//銷毀互斥鎖
return0;
}
#include
#include
#include
#include
#include
#include
#include
#define n 5
sem_t chopsticks[n]
;//設定5種訊號量,有5種不同型別的資源,每一種有1個,這樣便於理解,因為每個哲學家需要的資源不同
int philosophers[n]=;
//代表5個哲學家的編號
void delay (
int len)
i--;}
}void
*philosopher (
void
* arg)
else}}
int main (
int argc,
char
**ar**)
//建立執行緒
for(
int i=
0; i)//掛起執行緒
for(
int i=
0; i)//銷毀訊號量
for(
int i=
0; i)return0;
}
哲學家問題
問題描述 有五個哲學家繞著圓桌坐,每個哲學家面前有一盤面,兩人之間有一支筷子,這樣每個哲學家左右各有一支筷子。哲學家有2個狀態,思考或者拿起筷子吃飯。如果哲學家拿到乙隻筷子,不能吃飯,直到拿到2只才能吃飯,並且一次只能拿起身邊的一支筷子。一旦拿起便不會放下筷子直到把飯吃完,此時才把這雙筷子放回原處。...
哲學家就餐問題 C語言講解
原部落格 哲學家就餐問題 c語言講解 哲學家問題是作業系統中同步互斥的經典問題。通常使用訊號量,管程的方式。這篇文章將會簡要介紹問題的定義和類似服務生解法。並且用c語言實現解法。問題描述 五個哲學家圍繞坐在乙個圓形餐桌前,桌上放著五支筷子,每兩個哲學家之間放乙個筷子。哲學家的動作包括就餐和思考。思考...
哲學家就餐問題
本文是哲學家就餐問題在 linux 上的程式實現,與windows 平台的實現類似,程式上稍有不同。philosopherdining.cpp include include include include include include rasutil.h using namespace std ...