关键区域使用信号量和&amp ;;构建进程。 Mutex(Hoare 1973)

时间:2012-03-02 19:05:44

标签: process queue mutex semaphore monitor

研究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);

1 个答案:

答案 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了解详情!

相关问题