当前位置: 技术问答>linux和unix
100分跪求“哲学家就餐问题”在 Linux下运行的源代码(后缀名为.c)!!!
来源: 互联网 发布时间:2015-08-07
本文导语: 如题。 | 代码大致如下,当然不能直接使用,我没写P,V操作的函数。 # define N 5 /* 哲学家数目 */ # define LEFT (i-1+N)%N /* i的左邻号码 */ # define RIGHT (i+1)%N ...
如题。
|
代码大致如下,当然不能直接使用,我没写P,V操作的函数。
# define N 5 /* 哲学家数目 */
# define LEFT (i-1+N)%N /* i的左邻号码 */
# define RIGHT (i+1)%N /* i的右邻号码 */
# define THINKING 0 /* 哲学家正在思考 */
# define HUNGRY 1 /* 哲学家想取得叉子 */
# define EATING 2 /* 哲学家正在吃面 */
typedef int semaphore; /* 信号量是一个特殊的整型变量 */
int state[N]; /* 记录每个人状态的数组 */
semaphore mutex=1; /* 临界区互斥 */
semaphore s[N]; /* 每个哲学家一个信号量 */
void take_forks(int i);
void put_forks(int i);
void test(int i);
void eat();
void philosopher(int i) /* i:哲学家号码,从0到N-1 */
{
while(1)
{ /* 无限循环 */
think(); /* 哲学家正在思考 */
take_forks(i);
/* 需要两只叉子,或者阻塞 */
eat(); /* 进餐 */
put_forks(i);
/* 把两把叉子同时放回桌子 */
}
}
void take_forks(int i) /* i:哲学家号码从0到N-1 */
{
down(&mutex); /* 进入临界区 */
state[i]=HUNGRY; /* 记录下哲学家i饥饿的事实 */
test(i); /* 试图得到两只叉子 */
up(&mutex); /* 离开临界区 */
down(&s[i]); /* 如果得不到叉子就阻塞 */
}
void put_forks(int I) /* i:哲学家号码从0到N-1 */
{
down(&mutex); /* 进入临界区 */
state[i]=THINKING; /* 哲学家进餐结束 */
test(LEFT); /* 看一下左邻居现在是否能进餐 */
test(RIGHT); /* 看一下右邻居现在是否能进餐 */
up(&mutex); /* 离开临界区 */
}
void test(i) /* i:哲学家号码从0到N-1 */
{
if(state[i]==HUNGRY && state[LEFT]!=EATING && state[RIGHT]!=EATING)
{
state[i]=EATING;
up(&s[i]);
}
}
void think()
{
prinft("I am thinkingn");
}
int main()
{
int i;
for(i=0; i
# define N 5 /* 哲学家数目 */
# define LEFT (i-1+N)%N /* i的左邻号码 */
# define RIGHT (i+1)%N /* i的右邻号码 */
# define THINKING 0 /* 哲学家正在思考 */
# define HUNGRY 1 /* 哲学家想取得叉子 */
# define EATING 2 /* 哲学家正在吃面 */
typedef int semaphore; /* 信号量是一个特殊的整型变量 */
int state[N]; /* 记录每个人状态的数组 */
semaphore mutex=1; /* 临界区互斥 */
semaphore s[N]; /* 每个哲学家一个信号量 */
void take_forks(int i);
void put_forks(int i);
void test(int i);
void eat();
void philosopher(int i) /* i:哲学家号码,从0到N-1 */
{
while(1)
{ /* 无限循环 */
think(); /* 哲学家正在思考 */
take_forks(i);
/* 需要两只叉子,或者阻塞 */
eat(); /* 进餐 */
put_forks(i);
/* 把两把叉子同时放回桌子 */
}
}
void take_forks(int i) /* i:哲学家号码从0到N-1 */
{
down(&mutex); /* 进入临界区 */
state[i]=HUNGRY; /* 记录下哲学家i饥饿的事实 */
test(i); /* 试图得到两只叉子 */
up(&mutex); /* 离开临界区 */
down(&s[i]); /* 如果得不到叉子就阻塞 */
}
void put_forks(int I) /* i:哲学家号码从0到N-1 */
{
down(&mutex); /* 进入临界区 */
state[i]=THINKING; /* 哲学家进餐结束 */
test(LEFT); /* 看一下左邻居现在是否能进餐 */
test(RIGHT); /* 看一下右邻居现在是否能进餐 */
up(&mutex); /* 离开临界区 */
}
void test(i) /* i:哲学家号码从0到N-1 */
{
if(state[i]==HUNGRY && state[LEFT]!=EATING && state[RIGHT]!=EATING)
{
state[i]=EATING;
up(&s[i]);
}
}
void think()
{
prinft("I am thinkingn");
}
int main()
{
int i;
for(i=0; i