如何使用信号量实现监视器?
若要使用信号量实现监视器,需为每台监视器提供一个信号量 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--; }
广告