C語言實戰 哲學家問題

2021-10-06 21:18:54 字數 1672 閱讀 3641

有五個哲學家繞著圓桌坐,每個哲學家面前有一盤面,兩人之間有一支筷子,這樣每個哲學家左右各有一支筷子。哲學家有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 ...