哲学家问题

哲学家问题描述了五个哲学家围绕圆桌而坐,每人面前一盘面,筷子位于相邻哲学家之间。每个哲学家需要同时拿起左右两边的筷子才能吃饭。本文探讨了解决方案1和方案2。方案1通过限制同时拿筷子的哲学家数量,确保至少一人能进食;方案2则根据哲学家编号制定拿筷子规则,避免冲突。
摘要由CSDN通过智能技术生成

哲学家问题

有五个哲学家绕着圆桌坐,每个哲学家面前有一盘面,两人之间有一支筷子,这样每个哲学家左右各有一支筷子。哲学家有2个状态,思考或者拿起筷子吃饭。如果哲学家拿到一只筷子,不能吃饭,直到拿到2只才能吃饭,并且一次只能拿起身边的一支筷子。一旦拿起便不会放下筷子直到把饭吃完,此时才把这双筷子放回原处。如果,很不幸地,每个哲学家拿起他或她左边的筷子,那么就没有人可以吃到饭了。

解决方案1:

控制最多有4位哲学家拿起1根筷子,保证至少有一位哲学家可以吃到饭,并且在吃完后释放筷子,使其他哲学家可以吃饭。
先定义头文件;

#include<stdio.h>
#include<time.h>
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>

再定义存放筷子和哲学家的数组;

int chops[5]={
   0};
int phil[5]={
   1,2,3,4,5};

接下来是函数部分;
先初始化再判断有几位哲学家拿到了筷子

void *philos(void *arg) 
{
    
int m=*(int *)arg; 
int left=m,right=(m+1)%5; 
while(1) 
{
    
	printf("哲学家%d正在思考问题\n",m); 
	sleep(rand()%5); 
	printf("哲学家%d饿了\n",m); 
while(1) 
{
    
	int sum=chops[0]+chops[1]+chops[2]+chops[3]+chops[4]; 
	if(sum<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值