在学习操作系统的基本概念时,我在高级编程语言中的关键区域构造主题下找到了这段代码。这是霍尔在1973年给出的。我在网上搜索了一下,但找不到任何与此相关的参考资料。我的疑问是,为什么有两个队列:第一个延迟和第二个延迟?只需要一个队列就可以了吗?
构造:
region x when (B) S;
对于每个共享变量,将关联以下变量:
semaphore mutex, first-delay, second-delay;
int first-count, second-count;
信号量互斥被初始化为1;信号量第一延迟以及第二延迟被初始化为0。整数第一-计数和第二-计数初始化为0
代码:
wait (mutex) ;
while (!B) {
first-count++;
if (second-count > 0)
signal (second-delay) ;
else
signal (mutex) ;
wait (first-delay) ;
first-count--;
second-count++ ;
if (first-count > 0)
signal (first-delay) ;
else
signal(second-delay);
wait (second-delay) ;
second-count-- ;
}
S:
if (first-count > 0)
signal (first-delay) ;
else if (second-count > 0)
signal( second-delay) ;
else
signal(mutex);
它被设计为两个延迟,以避免频繁检查条件B。由于条件B被认为只受S的影响;因此,只有当S被执行时,我们才应该再次检查条件B。其余线程将被困在first_delay或second_delay。
当然,只要有一个延迟,代码就有意义了。试着用first_delay替换所有的second_delay,并消除琐碎的部分。你可能会得到这样的东西:
wait(mutex);
while (!B) {
first_count++;
if (first_count > 0)
signal(first_delay);
else
signal(mutex);
wait(first_delay);
first_count--;
}
S;
if (first_count > 0)
signal(first_delay);
else
signal(mutex);
然而,在这种情况下,条件B将被反复检查。
请访问此处了解更多详细信息!