研究OS的基本概念,我在高级编程语言的Critical region Constructs主题下发现了这段代码。这是Hoare在1973年给出的。我在网上搜索但是找不到与此有关的任何参考。我的疑问是,为什么有两个队列:第一次延迟和第二次延迟?只有一个队列可以完成工作吗?
构建体:
region x when (B) S;
对于每个共享变量,以下变量是关联的:
semaphore mutex, first-delay, second-delay;
int first-count, second-count;
信号量互斥量初始化为1;信号量第一次延迟 和第二个延迟初始化为0.整数第一个 - 第二个 - 第二个 - count初始化为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);
答案 0 :(得分:1)
它被设计为两个延迟,以避免经常检查条件B. 由于条件B被假定仅受S的影响;因此,只有在执行S时我们才应该再次检查条件B.其余的线程将被卡在second_delay的first_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。
访问HERE了解详情!