哲学家吃饭问题
2006-05-12 23:47
288 查看
/*欢迎转载交流,如果转载请注明作者和出处,谢谢合作。 * *设有5个哲学家,共享一张放有5把椅子的桌子,每人分得一把椅子, *但是,桌子上共有5只筷子,在每人两边各放一只,哲学家们在肚子饥饿 *时才试图分两次从两边拿起筷子就餐。 *条件: *1)拿到两只筷子时哲学家才开始吃饭。 *2)如果筷子已在他人手上,则该哲学家必须等他人吃完之后才能拿到筷子。 *3)任一哲学家在自己未拿到两只筷子前却不放下自己手中的筷子。 *要求: *1)描述一 个保证不会出现两个邻座同时要求吃饭的通信算法。 *2)描述一个即没有两个邻座同时吃饭,有没有饿死(永远拿不到筷子)的算法 *主要算法实现: *1) 使奇数项的哲学家从左手先拿筷子,然后再拿右手的筷子。 * 偶数项的哲学家就先拿右手的,再拿左手的。 *作者:bilicon *修改时间:2006.5.12 */ #include <stdio.h> #include <stdlib.h> #define people 5 #define meat 10 //肉块的数量 static int Tman[people]; int n = 1; //定义n为共吃肉的数量 /////////////////////定义一些需要跟哲学家对应的数组/////////////////////// static int Thinking[people]; //第n个哲学家在思考。如果为1就是真,0就假s static int Eating[people]; //第n个哲学家在吃。1为真,0为假 static int EatTimeAll[people]; static int EatTime[people]; static int MeatNo[people]; int getkey(int i) { //key(); if(i!=1) { if(i%2 != 0) //奇数就从左手开始拿筷子,然后再到右手。 { if(Tman[i-1] == 0) //i-1为第i个哲学家的左边的筷子0表示该筷子可用,1表示正在被用 { Tman[i-1] = 1; if(Tman[i] == 0) { Tman[i] = 1; return 1; } else { Tman[i-1] = 0; return 0; } } else { return 0; } } else //偶数先从右手开始拿筷子。 { if(Tman[i] == 0) //i-1为第i个哲学家的左边的筷子0表示该筷子可用,1表示正在被用 { Tman[i] = 1; if(Tman[i - 1] == 0) { Tman[i - 1] = 1; return 1; } else { Tman[i] = 0; return 0; } } else { return 0; } } } else { if(Tman[5] == 0) { Tman[5] = 1; if(Tman[1] == 0) { Tman[1] = 1; return 1; } else { Tman[5] = 0; return 0; } } else { return 0; } } } void eat() //n表示要吃的第n块肉 { int i; for(i=1;i<=people;i++) { int want; //想吃肉的哲学家 want = 1 + rand()%5; if(getkey(want) && n<=meat) { Eating[want] = 1; Thinking[want] = 0; printf("第%d个哲学家开始吃第%d块肉/n",want,n); MeatNo[want] = n; EatTimeAll[want] = 1 + rand() % 3; //哲学家不会无止境的吃下去的, //EatTime[i] = EatTimeAll[i]; //我设以3分钟内的随机时间为 n++; } } } void eatting() { int i; for(i=1;i<=5;i++) { if(Eating[i] == 1) { EatTime[i]++; printf("第%d个哲学家正在吃第%d块肉,共需%d秒,已用%d秒/n",i,MeatNo[i],EatTimeAll[i],EatTime[i]); } if(EatTime[i] == EatTimeAll[i] && EatTime[i] != 0) { printf("第%d个哲学家已经吃完第%d块肉/n",i,MeatNo[i]); MeatNo[i] = 0; Tman[i-1] = 0; Tman[i] = 0; Eating[i] = 0; Thinking[i] = 1; EatTime[i] = 0; } } } void thinking() { int i; for(i=1;i<=5;i++) { if(Thinking[i]) { printf("第%d个哲学家正在思考。/n",i); } } } void main() { int i,time; //初始化 for( i=1 ; i <= people ; ++i ) { Tman[i] = 0; EatTime[i] = 0; Eating[i] = 0; Thinking[i] = 1; } time = 0; for(;n<=meat;) { ++time; printf("=================这是第%d秒的开始==================/n",time); eat(); thinking(); //eatTime(); eatting(); printf("=================这是第%d秒的结束==================/n/n",time); } printf("哈哈,盘子里已经没有肉了./n"); }
相关文章推荐
- 死锁—哲学家吃饭问题
- 【Java】同步关键字就解决哲学家吃饭问题
- 5位哲学家吃饭问题(算法描述)
- 并发多线程之死锁-----哲学家吃饭问题
- 哲学家吃饭问题(资源加锁和超时释放)
- 哲学家吃饭问题 代码实现如何 避免线程死锁
- 爸爸妈妈儿子女儿吃水果问题以及五个哲学家吃饭问题
- 黑马程序员技术博客之哲学家吃饭问题
- java多线程哲学家思考吃饭问题
- 移动端多线程编程高级篇-哲学家吃饭问题
- 多进程竞争资源----哲学家就餐问题
- Java多线程之死锁(哲学家进餐问题)
- 哲学家就餐问题的C#实现
- Java总结(十)—实现Runnable接口创建线程,线程安全同步,死锁(哲学家进餐问题),读写锁
- 关于哲学家进餐问题
- 哲学家就餐问题
- 课程设计——利用信号量实现哲学家进餐问题(JAVA)
- JAVA多线程学习--哲学家就餐问题
- 使用Lock和Condition实现哲学家算法问题