(多线程同步练习)桌子上有一只盘子,每次只能放一只水果,爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,一个儿子专等吃盘子里的橘子,一个女儿专等吃盘子里的苹果。写出能使爸爸、妈妈、儿子、女儿正确同步工作的Simone Zeng的博客-CSDN博客桌子上有一只盘子
桌子上有一个盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等吃盘子中的橘子,女儿专等吃盘子中的苹果。只有盘子为空时,爸爸或妈妈才可向盘子中放一个水果,仅当盘子中_许你常欢的博客-CSDN博客
问题描述:
桌子上有一个盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等吃盘子中的橘子,女儿专等吃盘子中的苹果。只有盘子为空时,爸爸或妈妈才可向盘子中放一个水果;仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出。
问题分析:
关系分析。 这里的关系要稍复杂一些。 由每次只能向其中放入一只水果可知, 爸爸和妈妈是互斥关系。爸爸和女儿、妈妈和儿子是同步关系,而且这两对进程必须连起来,儿子和女儿之间没有互斥和同步关系,因为他们是选择条件执行,不可能并发
整理思路。 这里有4个进程,实际上可抽象为两个生产者和两个消费者被连接到大小为1的缓冲区上。
信号量设置。 首先将信号量plate设置互斥信号量,表示是否允许向盘子放入水果,初值为1表示允许放入,且只允许放入一个。信号量apple表示盘子中是否有苹果,初值为0表示盘子为空,不许取,apple= 1表示可以取。信号量orange表示盘子中是否有橘子,初值为0表示盘子为空,不许取,orange = 1表示可以取。
semaphore plate=1,apple=0, orange=0;
dad() {//父亲进程
while(1) {
prepare an apple;
P (plate) ;//互斥向盘中取、放水果
put the apple on the plate;//向盘中放苹果
V(apple) ;//允许取苹果
}
}
mom() {//母亲进程
while(1) {
prepare an orange;
P (plate);//互斥向盘中取、放水果
put the orange on the plate;//向盘中放橘子
V (orange) ;//允许取橘子
}
}
son() {//儿子进程
while(1) {
P (orange);//互斥向盘中取橘子
take an orange from the plate;
V (plate) ;//允许向盘中取、放水果
eat the orange;
}
}
daughter() {//女儿进程
while(1) {
P (apple) ;//互斥向盘中取苹果
take an apple from the plate;
V(plate) ;//运行向盘中取、放水果
eat the apple;
}
}
- dad0和 daughter()、mom)和son()必须连续执行,正因为如此,也只能在女儿拿走苹果后或儿子拿走橘子后才能释放盘子,即V(plate)操作。