如何使用信号量实现监视器?
为了使用信号量实现监视器,为每个监视器提供了一个信号量互斥锁(已初始化为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--; }