設有
就餐條件是:
試問:
哲學家進餐問題是典型的同步問題
利用記錄型信號量解決哲學家進餐問題
經分析可知
var chopstick:array[
所有信號量被初始化為
repeat
wait(chopstick);
wait(chopstick[(i+
eat;
signal(chopstick);
signal(chopstick[(i+
think;
until false;
在以上描述中
(
(
(
看了整整一個上午的操作系統
我們老師的算法的大意好像是用一個總的信號量
具體算法如下(用類c描述)
#include
#define N
#define left (i
#define right (i+
#define think
#define hungry
#define eating
typedef int semaphore //信號量是一個特殊的整型變量
int state[N] //記錄每個人的狀態
semaphore mutex=
semaphore s[N]; //每個哲學家一個信號量
void philosopher(int i)
{
while(true) //無限循環
{
think;
take_chopstick(i);
eat;
put_chopstick(i);
}
}
void take_chopstick(int i)
{
p(& mutex); //對信號量的p操作
state=hungry;
test(i); //試圖得到兩支筷子
v(&mutex); //v操作
p(&s); //得不到筷子則阻塞
}
void put_chopstick(int i)
{
p(& mutex);
state=think; //進餐結束
test(left); //看左鄰是否進餐
test(right); //再看右鄰
v(&mutex);
}
void test(int i)
{
if(state==hungry&&左鄰沒進餐&&右鄰沒進餐)
{
state=eating;
v(&s);
}
}
From:http://tw.wingwit.com/Article/program/c/201404/30443.html