桌上有一个只能放入一个水果的盘子,爸爸专向盘子中放苹果(apple),妈妈专向盘子中放桔子(orange),儿子专等吃盘子中的桔子,女儿专等吃盘子里的苹果 。
如果有两个家庭的爸爸、妈妈、儿子、女儿和二只盘子呢?这时候应该如何改写代码办?
有一个盘子的情况已经分析过了。现在看有两个家庭的情况。
semaphore mutex = 1; // 用于对缓冲区的互斥操作
semaphore apple = 0;
semaphore orange = 0;
/*semaphore empty = 0;semaphore full = 0;*/
semaphore plate = 2; // 盘子中还可以放多少个水果
int dishes[2]; //盘子里的水果
int in = 0, out = 0;
void father(){
produce an apple;
wait(plate);
wait(mutex);
if(dishes[in] == apple or dishes[in] == orange)//既然能进入临界区,那么必有一个空盘子,如果第一个不为空,第二个肯定空着
in = (in+1)%2;
dishes[in] = apple; //放苹果
siganl(mutex);
siganl(apple);
}
void mother(){
produce an orange;
wait(plate);
wait(mutex);
if(dishes[in] == apple or dishes[in] == orange)
in = (in+1)%2;
dishes[in] = orange;
siganl(mutex);
siganl(orange);
}
void son(){
wait(orange);
wait(mutex);
if(dishes[out] == apple)
out = (out+1)%2;
get an orange from dishes[out];
out = (out+1)%2;
siganl(mutex);
siganl(plate);
eat the orange;
}
void daughter(){
wait(apple);
wait(mutex);
if(dishes[out] == orange)
out = (out+1)%2;
get an apple from dishes[out];
out = (out+1)%2;
siganl(mutex);
siganl(plate);
eat the apple;
}
其实一个盘子的时候,不加上对盘子互斥访问的信号量也可以…
我也不知道为什么,试了试不会发生死锁。
原文:几个进程同步问题