#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <semaphore.h>
#include <sys/types.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
sem_t chair;
sem_t Fork[5];
pthread_t threads_p[5];
void *philosopher_thread(void *);
int main()
{
int i;
sem_init(&chair, 0, 4);
for(i=0; i<5; i++)
sem_init(&Fork[i], 0, 1);
for(i=0; i<5; i++)
{
pthread_create(&threads_p[i], NULL, philosopher_thread, (void *)i);
}
for(i=0; i<5; i++)
{
pthread_join(threads_p[i], NULL);
}
return 0;
}
void *philosopher_thread(void *args)
{
int id = (int)args;
while(1)
{
printf("哲学家 %d 正在思考\n", id);
sem_wait(&chair);
sem_wait(&Fork[id]);
sem_wait(&Fork[(id+1)%5]);
printf("哲学家 %d 正在吃饭\n\n", id);
sem_post(&chair);
sem_post(&Fork[id]);
sem_post(&Fork[(id+1)%5]);
sleep(2);
}
}