哲学家就餐问题

1.问题描述

哲学家问题是由Dijkstra提出并解决的,是典型的进程(线程)同步问题。该问题描述的是:有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五盘意大利面,有五只叉子,他们的生活方式是交替的进行思考和就餐。平时,一个哲学家进行思考,饥饿时便试图拿起自己左右两边的叉子进餐,只有拿到两只叉子时才可以进餐,进餐完毕后,便放下叉子继续思考。

 

2.示例代码

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<semaphore.h>
#include<pthread.h>
#define LEFT (i+4)%5
#define RIGHT (i+1)%5
#define THINKING 0
#define HUNGRY 1
#define EATING 2


sem_t philosopher[5];
pthread_mutex_t mutex;
int state[5];

void philoso(int i)
{
   
   while(1)
   {

   if(state[i] == THINKING)
   {

       state[i] = HUNGRY;

   }
   else if(state[i] == HUNGRY)
   {

       if(sem_trywait(&philosopher[LEFT]) == 0) //left fork is ok.
       {
       if(sem_trywait(&philosopher[RIGHT]) == 0)
       {

           state[i] = EATING;

       }
       else
       {
           sem_post(&philosopher[LEFT]);

       }
       }
   }
   else
   {

       sem_post(&philosopher[RIGHT]);
       sem_post(&philosopher[LEFT]);
       state[i] = THINKING;

   }
   
    pthread_mutex_lock(&mutex); 
    printf("i am NO.%d  my state is %d....\n",i,state[i]);
        pthread_mutex_unlock(&mutex);
    sleep(1);
   }

   
}

int  main()
{
  
    pthread_t threadID[5];
    int init2,i;
    int ret[5];
    int init1 = pthread_mutex_init(&mutex,NULL);
    if(init1 != 0)
          {
            printf("mutex init failed \n");
            exit(1);

          } 
   for(i = 0 ; i < 5 ; i++)
       state[i] = 0;
//初始化信号量 
    for(i = 0 ; i < 5; i++)
   {
    init2 = sem_init(&philosopher[i], 0, 1); 
    if(init2 != 0)
    {
       printf("the philosopher NO.%d 's semapher is failed\n",i);
    }
   }

//创建哲学家线程     
   for(i = 0; i < 5; i++)
   {
       ret[i] = pthread_create(&threadID[i], NULL, (void *)philoso, i);
           if(ret[i] != 0)
                {
                   printf("the thread of philosopher NO.%d  is failed\n",i);
        }
      }
//撤销线程    
   for(i = 0; i < 5; i++)
         {
                         pthread_join(threadID[i],NULL);

        }
        exit(0); 

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值