Linux哲学家进餐杀死进程,100分跪求“哲学家就餐问题”在 Linux下运行的源代码(后缀名为.c)!!!...

本文介绍了一个经典的并发控制问题——哲学家就餐问题,并提供了一种解决方案。该方案通过定义信号量和哲学家的状态来确保没有两个相邻的哲学家同时进餐。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如题。

|

代码大致如下,当然不能直接使用,我没写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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值