如何使用信号量实现监视器?
若要使用信号量实现监视器,需为每台监视器提供一个信号量 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--;
}
广告
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
安卓
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP