哲学家问题
有五个哲学家绕着圆桌坐,每个哲学家面前有一盘面,两人之间有一支筷子,这样每个哲学家左右各有一支筷子。哲学家有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<