如何使用信号量实现监视器?


若要使用信号量实现监视器,需为每台监视器提供一个信号量 mutex(初始化为 1)。流程进入监视器前必须执行 Wait(mutex),离开监视器后必须执行 signal(mutex)。由于发出信号的流程必须等到恢复的流程离开或等待,所以引入了另外一个信号量 next,并初始化为 0。发出信号的流程可用 next 暂停自身。还提供了整型变量 next_count 来统计在 next 上暂停的流程数量。因此,每个外部函数 F 都被替换为-

wait(mutex);
…
body of F
...
if (next_count > 0)
   signal(next);
else
   signal(mutex);

可确保监视器内的互斥。我们现在来看看条件变量如何实现的。对于每个条件 x,我们引入了信号量 x _sem 和整型变量 x_count,两者都初始化为 0。操作 x.wait() 现在可实现为 −

x_count++;
if (next_count > 0){
   signal(next);
}
   else {
   signal(mutex);
}
wait(x_sem);
x_count--;

操作 x.signal() 可实现为 −

if (x _count > 0){
   next_count++;
   signal(x_sem);
   wait(next);
   next_count--;
}

更新日期:2019-10-11

2,000+ 浏览

开启您 事业

参加培训班获得认证

开始学习
广告