1、第一种情况:现实生活中阅览室的门可以同时进入或出去多个人,题目中也没有其他限定时,可以只设立同步信号量即可。
伪代码如下:
int n = 150;
semaphore empty = n;/*empty表示剩余的空位*/
void reader(){
while (1){
P(empty);
//读者进入
//读者离开
V(empty);
}
}
虽然这里代码很简洁,但代码量确实是够了的,已经能够模拟这个问题。
因为P、V操作是原语,代码执行不会被打断,当他去修改empty时,其他操作就要等当前原语操作结束后才能使用empty,所以不存在覆盖导致的数据出错。
2、第二种情况:如果题目说明了进阅览室或者出阅览室要登记,且每次只能允许一个人登记或注销登记,就需要设置互斥信号量。
伪代码如下:
int n = 150;
semaphore empty = n;/*empty表示剩余的空位*/
semaphore mutex = 1;
void reader(){
while (1){
P(empty);
//读者进入
P(mutex);
//登记进入
V(mutex);
P(mutex);
//登记离开
V(mutex);
//读者离开
V(empty);
}
}