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);
}