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

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