例题: 有一阅览室,读者进入时必须先在一张登记表上登记。该表中每个单元格代表阅览室中的一个座位。读者离开时要注销掉其登记信息。阅览室共有 50 个座位。登记表每次仅允许一位读者进行登记或注销。某一读者登记时,若发现登记表满,则他需在阅览室外等待,直至有空位再登记进入。试用 类Pascal语言 和 P、V 操作,描述读者行为。【国防科技大学2000】(注:【南昌大学2002】类似)
//答案:
/* 基于 C 语言写的伪代码 */
semaphore seats = 50; // 用信号量 seats 表示可用的座位数, 初值为 50;
semaphore mutex = 1; // 信号量 mutex 表示登记表是否正在使用, 初值为 1.
while(1){
"读者进程Si()" // i = 1, 2, 3,...,n
while(1){
P(seats);
P(mutex);
//读者登记
V(mutex);
//读者阅读
P(mutex);
//读者注销
V(mutex);
V(seats);
//读者离开
}
}
解题思路: 因为只有有人进阅览室,才能有人出,所以这里把读者登记和注销当一个进程,用信号量mutex来互斥读者之间登记和注销;