题19

题目

【2013 统考真题】某博物馆最多可以容纳 人同时参观,有一个出入口,该出入口一次仅允许一个人通过。参观者的活动描述如下:

cobegin
参观者进程i:
{
	...
	进门;
	...
	参观;
	...
	出门;
	...
}
coend

请添加必要的信号量和 P、V(或 wait()、signal())操作,以实现上述过程中的互斥与同步。要求写出完整的过程,说明信号量的含义并赋初值。

分析

注意下面这个empty资源只有一个对象在使用,只需要定义empty,而不是empty = 500full=0。但是我感觉定义了应该也不错?

出入口一次仅允许一人通过, 设置互斥信号量 mutex, 初值为 1 。博物馆最多可以同时容纳 500 人, 因此设置信号量 empty, 初值为 500

semaphore empty = 500; // 博物馆可以容纳的最多人数
semaphore mutex = 1; // 用于出入口资源的控制
 
cobegin
    参观者进程 i: {
        // ...
        P(empty); // 可容纳人数减 1
        P(mutex); // 互斥使用门
        进门;
        V(mutex);
        参观;
        P(mutex); // 互斥使用门
        出门;
        V(mutex);
        V(empty); // ⚠️ 可容纳人数增 1
    }