P、V操作解决同步问题
题目:
试用 P、V操作描述下列理发师和顾客之间的同步问题:
某个理发理师当没有顾客时,去睡觉;当有顾客来理发,若理发师正在睡觉时,这个顾客会叫醒他,理发师给该顾客理发,理发期间若还有顾客到达则等待理发理师依次理发,直到没有顾客到来,理发理师又去睡觉。
分析思路:
题目可以看做是 N个生产者和一个消费者问题。顾客作为生产者,每到来一位,就应将计数器 rc 计数一次,以便让理发师理发至最后一位顾客。
因此顾客进程执行的第一个语句便是 rc=rc+1。而第一个到来的顾客应负责唤醒理发师,理发师此时正在信号量 wakeup上等待(P(wakeup));该信号量初值为 0,由第一个顾客执行 V(wakeup)。
若该顾客不是第一个到达者,则在信号量 wait上等待(P(wait));该信号量初值为 0,等到理发师给前一位顾客理完发后执行 V(wait),便给该顾客理发。
以上过程循环往复,理发师每处理完一个顾客,就令计数器 rc值减 1,当 rc=0时,便知此时无顾客,理发师可继续睡觉,等待下一批顾客的到达。为了保证对计数器 rc互斥使用,还需要设置信号量 mutex(初值为 1)。
一定要设置信号量代表的含义和初值,P操作和V操作是对应的
答:用 P、V操作描述理发师和顾客之间的同步问题:
wakeup, wait, mutex : Semaphore;
wakeup := 0; wait := 0; mutex := 1;
cobegin
顾客进程:
{
P(mutex);
rc= rc+1;
if (rc==1)
V(wakeup);
else
P(wait);
V(mutex);
理发;
}
理发师进程:
{
P(wakeup);
while (rc!=0)
{
理发;
P(mutex);
rc=rc-1;
if (rc!=0)
V(wait);
V(mutex);
}
}
coend