Linux环境下实现哲学家就餐问题(2)

时间:2023-03-09 00:03:49
Linux环境下实现哲学家就餐问题(2)
#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> #define NUM_THREADS_P 5
#define CHAIR_NUM 4
#define CHOP_NUM 5 int chairflg[CHAIR_NUM][],dining_num = ;
sem_t chair,chopstics[CHOP_NUM],mutex,mutex1,print_mutex;
pthread_t threads_p[NUM_THREADS_P]; void *philosopher_thread(void *args); int main(void)
{
int i; sem_init(&chair, , CHAIR_NUM);
for(i=; i<CHOP_NUM; i++)
{
sem_init(&chopstics[i], , );
}
sem_init(&mutex, , );
sem_init(&mutex1, , );
sem_init(&print_mutex, , );
for(i=; i<CHAIR_NUM; i++)
chairflg[i][] = ; for(i=; i<NUM_THREADS_P; i++)
{
pthread_create(&threads_p[i], NULL, philosopher_thread, (void *)i);
}
for(i=; i<NUM_THREADS_P; i++)
{
pthread_join(threads_p[i], NULL);
} // sem_destroy(&chair);
// sem_destroy(&chopstics[CHOP_NUM]);
// sem_destroy(&mutex);
// sem_destroy(&mutex1);
// sem_destroy(&print_mutex); return ;
} void *philosopher_thread(void *args)
{
while()
{
int i,j;
i = (int)args;
printf("philosopher %d is thinking\n",i);
sleep(rand()%);
sem_wait(&chair);
sem_wait(&mutex); for(j=; j<CHAIR_NUM;j++)
{
if(chairflg[j][] == )
{
chairflg[j][] = ;
chairflg[j][] = i;
break;
}
}
dining_num++;
sem_post(&mutex);
sem_wait(&chopstics[i]);
printf("philosopher %d get chopstics %d\n",i,i);
sem_wait(&chopstics[(i+)%CHOP_NUM]);
printf("philosopher %d get chopstics %d\n",i,(i+)%CHOP_NUM); sleep(rand()%);
sem_wait(&print_mutex);
printf("philosopher %d is dining,when he is dining,there are %d philosophers at table.\n",i,dining_num); for(j=; j<CHAIR_NUM; j++)
{
if(chairflg[j][] == i)
{
printf("philosopher %d in chair %d\n",i,j);
}
}
printf("\n\n");
sem_post(&print_mutex);
sleep(rand()%);
sem_post(&chopstics[i]);
sem_post(&chopstics[(i+)%CHOP_NUM]);
sem_wait(&mutex1); for(j=; j<CHAIR_NUM; j++)
{
if(chairflg[j][] == i)
{
chairflg[j][] = ;
break;
}
}
dining_num--;
sem_post(&mutex1);
sem_post(&chair);
printf("philosopher %d leaves\n",i); }
}