代码在gcc上实现
#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include<unistd.h>
pthread_mutex_t chopstick[6];
void *eat_think(void *arg)
{
char philosopher = *(char *)arg;
int left, right;
switch (philosopher) {
case 'A':
left = 5;
right = 1;
break;
case 'B':
left = 1;
right = 2;
break;
case 'C':
left = 2;
right = 3;
break;
case 'D':
left = 3;
right = 4;
break;
case 'E':
left = 4;
right = 5;
break;
}
int i;
while (1) {
sleep(2);
pthread_mutex_lock(&chopstick[left]);
printf("Philosopher %c gets chopstick %d\n", philosopher, left);
if (pthread_mutex_trylock(&chopstick[right]) == EBUSY) {
pthread_mutex_unlock(&chopstick[left]);
continue;
}
printf("Philosopher %c gets chopstick %d\n", philosopher, right);
printf("Philosopher %c is eating.\n", philosopher);
sleep(2);
pthread_mutex_unlock(&chopstick[left]);
printf("Philosopher %c release chopstick %d\n", philosopher, left);
pthread_mutex_unlock(&chopstick[right]);
printf("Philosopher %c release chopstick %d\n", philosopher, right);
}
}
int main() {
pthread_t A, B, C, D, E;
int i;
for (i = 0; i < 5; i++)
pthread_mutex_init(&chopstick[i], NULL);
pthread_create(&A, NULL, eat_think, "A");
pthread_create(&B, NULL, eat_think, "B");
pthread_create(&C, NULL, eat_think, "C");
pthread_create(&D, NULL, eat_think, "D");
pthread_create(&E, NULL, eat_think, "E");
pthread_join(A, NULL);
pthread_join(B, NULL);
pthread_join(C, NULL);
pthread_join(D, NULL);
pthread_join(E, NULL);
return 0;
}