哲学家就餐问题

哲学家就餐问题

有5位哲学家倾注毕生精力用于思考和吃饭,他们围坐在一张圆桌旁,在圆桌上有5个碗和5支筷子。每位哲学家的行为通常是思考,当其感到饥饿时,便试图取其左右最靠近他的筷子进餐。只有他拿到两支筷子后才能进餐,进餐完毕后,释放两支筷子并继续思考。
要求:采取合适的方法,防止出现死锁的问题。

仅当左右两边筷子都能用的时候让他取筷子

设置一个信号量mutex,

mutex为N-1的初始值,一共有N个哲学家,当mutex=N-1的时候,最多N-1个线程被锁住,而剩下的一个可以执行,当它执行完以后释放“筷子”资源又会让其他被阻塞的线程解锁,从而避免整个程序被锁住

#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 *id= (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,N-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)
       { //pthread_create()函数成功执行返回1,出错返回-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);
}

在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值