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);
}
阅读(2179) | 评论(0) | 转发(0) |