某博物馆最多可以容纳 500 人同时参观,有一个出入口,该出入口一次仅允许一个人通过。参观者的活动描述如下:
cobegin 参观者进程i: { ... 进门; ... 参观; ... 出门; ... } coend
请添加必要的信号量和P、V(或wait( )、signal( ))操作,以实现上述过程中的互斥与同步。要求写出完整的过程,说明信号量的含义并赋初值。
本题考察记录型信号量的基本使用,资...
用户登录可进行刷题及查看答案
本题考察记录型信号量的基本使用,资源信号量的命名直接用资源的名称命名即可。
某博物馆最多可以容纳 500 人同时参观,设博物馆的资源初始信号量为 museum=500 或 empty=500 。
有一个出入口,该出入口一次仅允许一个人通过,设出入口的资源初始信号量为 door=1 。由于资源数恰巧为 1 ,用一个互斥信号量 mutex=1 表示也是可以的。
由于这里人的所有操作都是可以手动(主动)调用信号量,不需要添加 while(1) 或者 while(true) 死循环。
semaphore museum = 500; // 博物馆可容纳人数 semaphore door = 1; // 出入口可容纳人数 cobegin 参观者进程i: { P(museum); P(door); 进门; V(door); 参观; P(door); 出门; V(door); V(museum); } coend
这道题P(museum)和P(door)的顺序上要先P(museum)再P(door),也就是先保证博物馆未满再进人。如果先P(door)再P(museum),我们假想一直特殊情况,此时有人进门了,博物馆恰好满了,一个人正好要进人博物馆,执行了P(door),门就被堵死了,外面的人进不去,里面的人出不来。同理,最后V(museum)和V(door)的顺序上要先V(door)再V(museum)。
或者改写用empty和mutex命名,重写如下:
semaphore empty = 500; // 博物馆可容纳人数 semaphore mutex = 1; // 用于出入口资源的控制 cobegin 参观者进程i: { P(empty); P(mutex); 进门; V(mutex); 参观; P(mutex); 出门; V(mutex); V(empty); } coend
使用互斥锁mutex有一个原则,mutex控制的互斥操作里面只包含必要操作,P(empty)和V(empty)都防止互斥操作外面,这样可以不用进行上面那么繁琐的分析。
登录后提交答案
暂无评论,来抢沙发