其他分享
首页 > 其他分享> > 哲学家就餐问题

哲学家就餐问题

作者:互联网

哲学家就餐问题

有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);
}

标签:就餐,哲学家,create,pthread,问题,person,printf,sem,id
来源: https://blog.csdn.net/caoxiaobao1207/article/details/116786308