linux下 多线程编程 哲学家就餐问题

程序代码如下:(用‘最多只允许4个哲学家入席’解决死锁)

/* 
   椅子的序号依次为 1,2,3,4,5
   哲学家的自定义标志符依次为 1,2,3,4,5
   筷子的序号依次为 0,1,2,3,4
   每个哲学家入席后根据自己的序号,坐到对应序号的椅子上
   当有哲学家就餐时,用位置表显示所有哲学家标识符及其所坐的位置
   (其中椅子编号为0表示该哲学家已离开桌子,见输出结果)
*/
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <time.h>

#define  NUM  5
                                                           // 函数申明
void  sitthink(int);                                //入席及思考函数
void  dining(int);                                  //就餐函数
void  leave(int);                                   //离开函数
void  position(void);                            //输出各个哲学家位置函数
void * philosopherProc(void *param); //操作函数
sem_t  chopstick[NUM];                      //筷子信号量
sem_t  seat;                                        //最大入席人数信号量
int  posNum[NUM];                              //位置表

int  main(void)                                     //主函数
{
 int  i,j,phId[NUM];
 pthread_t  philosopher[NUM];           //定义5个哲学家线程
 sem_init(&seat,0,4);                          //初始化最大入席人数信号量

 for(i=0;i<NUM;i++)                           //初始化筷子信号量
{
  sem_init(&(chopstick[i]),0,1);
}

 for(j=0;j<NUM;j++)                         //创建并启动5个哲学家线程
 {
   phId[j]=j+1;
   pthread_create(&(philosopher[j]),NULL,philosopherProc,(void*)&phId[j]);
   usleep(100);
  }
  pthread_join(philosopher[0],NULL);  //等待线程结束
  pthread_join(philosopher[1],NULL);
  pthread_join(philosopher[2],NULL);
  pthread_join(philosopher[3],NULL);
  pthread_join(philosopher[4],NULL);
  return 0;
}

void sitthink(int id)                            //入席及思考函数
{
  posNum[id-1]=id;
  srand(time(NULL));
  printf("philosopher %d has sitted and thinking.../n",id);
  usleep(rand()%200);                     //思考随机一段时间
}

 

void  dining(int id)                           //就餐函数
{
  printf("philosopher %d  is dining.../n",id);
  position();
  sleep(3);                                       //就餐3秒钟
}

void  leave(int id)                           //离开函数
{
  printf("philosopher %d  has finished eating and leaved/n",id);
  posNum[id-1]=0;                        //位置清零
  sleep(3);
}

这次只上传了部分代码,以后再传!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值