Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1363598
  • 博文数量: 632
  • 博客积分: 2778
  • 博客等级: 大尉
  • 技术积分: 3387
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 09:09
个人简介

123

文章分类

全部博文(632)

文章存档

2014年(36)

2013年(33)

2012年(563)

分类: LINUX

2012-10-24 11:38:24

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

转自:http://blog.csdn.net/zhangmd1005/article/details/1685913

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

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

#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{
  sem_init(&(chopstick[i]),0,1);
}

 for(j=0;j {
   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);
}

阅读(2202) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~