基于信号量的进程同步与互斥(2)
1. 三个进程P1、P2、P3 互斥使用一个包含N(N>0)个单元的缓冲区。P1 每次用produce()生成一个正整数并用put()送入缓冲区某一个空单元中;P2 每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3 每次用 geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义的信号量的含义。
本题主要考察生产者-消费者的变形,一个生产者对应两个消费者,注意要写cobegin-coend等语句
(1)缓冲区是一互斥资源,因此设互斥信号量mutex;
(2)同步问题:P1、P2因为奇数的放置与取用而同步,设同步信号量odd;P1、P3因为偶数的放置与取用而同步,设同步信号量even;P1、P2、P3因为共享缓冲区,设同步信号量empty。
semaphore mutex = 1, odd = 0, even = 0, empty = N;
main()
cobegin{
Process P1
while (true) {
number = produce();
P(empty);
P(mutex);
put();
V(mutex);
if number % 2 == 0
V(even);
else
V(odd);
}
Process P2
while (true) {
P(odd);
P(mutex);
getodd();
V(mutex);
V(empty);
countodd();
}
Process P3
while (true) {
P(even);
P(mutex);
geteven();
V(mutex);
V(empty);
counteven();
}
}coend
2. 一个野人部落从一个大锅中一起吃炖肉,这个大锅一次可以存放 M 人份的炖肉。当野人们想吃的时候,如果锅中不空,他们就自助着从大锅中吃肉。如果大锅空了,他们就叫醒厨师,等待厨师再做一锅肉。
野人线程未同步的代码如下:
while (true){
getServingFromPot();
eat();
}

本文深入探讨了基于信号量的进程同步与互斥机制,包括生产者-消费者问题的变形、野人与厨师的大锅炖肉同步、寿司店就餐约束、搜索-插入-删除的链表操作同步等,提供了详细的信号量机制实现。
最低0.47元/天 解锁文章
2598

被折叠的 条评论
为什么被折叠?



