为了使用信号量实现监视器,为每个监视器提供了一个信号量互斥锁(已初始化为1)。Wait(mutex)必须在进入监视器之前由进程执行,并且必须在离开监视器之后执行signal(mutex)。由于信令过程必须等待,直到恢复的过程离开或等待,所以引入了另一个信号量(下一步),初始化为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--;
}