哲学家就餐问题
有5位哲学家倾注毕生精力用于思考和吃饭,他们围坐在一张圆桌旁,在圆桌上有5个碗和5支筷子。每位哲学家的行为通常是思考,当其感到饥饿时,便试图取其左右最靠近他的筷子进餐。只有他拿到两支筷子后才能进餐,进餐完毕后,释放两支筷子并继续思考。
要求:采取合适的方法,防止出现死锁的问题。
仅当左右两边筷子都能用的时候让他取筷子
设置一个全局互斥量mutex,用来锁住全部的临界资源,当一个哲学家企图拿筷子的时候,就将所有的资源锁住,然后让他去拿他需要的筷子,等他需要的两个筷子都取到之后之后,就解锁,然后让其他哲学家取筷子。
#include<stdio.h>
#include<semaphore.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/ipc.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#define N 5
sem_t chopstick[N];
sem_t mutex;
void eating(int id)
{
printf("哲学家 %d 正在吃饭 23333 \n",id);
}
void thinking (int id)
{
printf("哲学家 %d 正在思考 23333 \n",id);
}
void hungry(int id)
{
printf("哲学家 %d 处于饥饿 23333 \n",id);
}
void* person_work(void* f_id)
{
int *i d= (int*) f_id;
while(1)
{
hungry(*id);
sem_wait(&mutex);
sem_wait(&chopstick[*id]);
printf("哲学家 %d 拿起了 %d 号筷子,只有一只筷子不能吃饭\n",*id,*id);
sem_wait(&chopstick[(*id+1)%N]);
printf("哲学家 %d 拿起了 %d 号筷子,准备开始吃饭\n",*id,(*id+1)%N);
sem_post(&mutex);
eating(*id);
sem_post(&chopstick[*id]);
printf("哲学家 %d 放下了 %d 号筷子\n",*id,*id);
sem_post(&chopstick[(*id+1)%N]);
printf("哲学家 %d 放下了 %d 号筷子\n",*id,(*id+1)%N);
thinking(*id);
}
}
int main(int argc,char *argv[])
{
for(int i=0;i<N;i++)
{
sem_init(&chopstick[i],0,1);
}
sem_init(&mutex,0,1);
pthread_t person_x[N];
int a1=0,a2=1,a3=2,a4=3;
int i=4;
if(pthread_create(&person_x[0],NULL,person_work,&a1)==-1)
{
printf("create : error\n");
exit(0);
}
if(pthread_create(&person_x[1],NULL,person_work,&a2)==-1)
{
printf("create : error\n");
exit(0);
}
if(pthread_create(&person_x[2],NULL,person_work,&a3)==-1)
{
printf("create : error\n");
exit(0);
}
if(pthread_create(&person_x[3],NULL,person_work,&a4)==-1)
{
printf("create : error\n");
exit(0);
}
if(pthread_create(&person_x[4],NULL,person_work,&i)==-1)
{
printf("create : error\n");
exit(0);
}
pthread_join(person_x[0],NULL);
pthread_join(person_x[1],NULL);
pthread_join(person_x[2],NULL);
pthread_join(person_x[3],NULL);
pthread_join(person_x[4],NULL);
}