A问题:
1965年,Dijkstra提出并解决了一个他称之为哲学家进餐的同步问题。
“五个哲学家围坐在一张圆桌周围,每个哲学家的前面都有一份通心面,由于面条很滑,必须使用2把叉子才能夹住。相邻2份通心面之间有1把叉子。哲学家的生活包括:吃饭、思考。当哲学家感觉饿了,他就试图分2次取他左右的叉子,每次拿1把,但不分次序。如果成功获得2把叉子,则开始吃饭,吃完放下叉子继续思考。”
问题要求不能死锁。
A解决:
#define N 5 #define LEFT (i+N-1)%N #define RIGHT (i+1)%N #define THINKING 0 #define HUNGRY 0 #define EATING 2 typedef int semaphore; int state[N]; semaphore mutex=1; semaphore s[N]; void philosopher(int i) { while(TRUE) { think(); take_forks(i); eat(); put_forks(i); } } void take_forks(int i) { down(&mutex); state[i] = HUNGRY; test(i); up(&mutex); down(&s[i]); } void put_forks(int i) { down(&mutex); state[i] = THINKING; test(LEFT); test(RIGHT); up(&mutex); } void test(i) { if(state[i] == HUNGRY && state[LEFT] != EATING && state[RIGHT != EATING]) { up(&s[i]); } }
访问哲学家状态数组时进行互斥
当前哲学家饿了,且左右哲学家都没有进餐时,设置信号量。
之后根据信号量(是否设置过)进行确定是否阻塞。