首先给哲学家编号:0 1 2 3 4,将编号为奇数的分为一类,偶数的分为一类,编号为奇数的先拿起左手的筷子,偶数的拿起右手的筷子,此时,4号一定可以吃到东西,然后他放下筷子,此时,0号和3号争抢筷子进餐。这样可避免死锁的发生。
每一个哲学家就是一个线程,筷子放进一个列表里,初始值均为1,代表筷子都可用,每一个线程的ID为0~5,每个筷子对应哲学家的编号,1号左手边的筷子定义为a[1] (ID),右手定义a[2] (ID+1)%5)。当拿起筷子时。1变为0,吃完后0变为1。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <pthread.h>
#include <errno.h>
#include <math.h>
pthread_mutex_t chopstick[6] ;
void *eat_think(void *arg)
{
char phi = *(char *)arg;
int left,right; //左右筷子的编号
switch (phi)
{
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;
for(;;)
{
usleep(3); //思考
pthread_mutex_lock(&chopstick[left]); //拿起左手的筷子
printf("Philosopher %c fetches chopstick %d\n", phi, left);
if (pthread_mutex_trylock(&chopstick[right]) == EBUSY)
{
pthread_mutex_unlock(&chopstick[left]);
continue;
}
printf("Philosopher %c fetches chopstick %d\n", phi, right);
printf("Philosopher %c is eating.\n",phi);
usleep(3); //吃饭
pthread_mutex_unlock(&chopstick[left]); //放下左手的筷子
printf("Philosopher %c release chopstick %d\n", phi, left);
pthread_mutex_unlock(&chopstick[right]); //放下左手的筷子
printf("Philosopher %c release chopstick %d\n", phi, right);
}
}