Столовые философы с мониторами

Используя следующий код для решения обеденного философа с монитором. Я не понимаю, почему метод test () вызывает

self[i].signal();

Насколько я понимаю, сигнал вызывается, когда существует его критическая секция, т.е. когда философ заканчивает есть, не раньше. В этом случае, если кто-то вызывает resource.pickup (), а затем установить Philosher i на голодный, вызовите test (), чтобы увидеть, доступны ли ОБА палочки для еды сейчас (что является основным преимуществом по сравнению с семафорным решением). Однако в пределах test (), если оба соседа не едят и я голоден, вызовите signal()??! Как я понимаю, signal () увеличивает счетчик ресурсов и вызывается, когда кто-то покидает критическую секцию (которую мы видим в putdown (), я не понимаю, почему она вызывается здесь).

 // Dining-Philosophers Solution Using Monitors

monitor DP
{
    status state[5];
    condition self[5];

    // Pickup chopsticks
    Pickup(int i)
    {
        // indicate that I’m hungry
        state[i] = hungry;

        // set state to eating in test()
        // only if my left and right neighbors 
        // are not eating
        test(i);

        // if unable to eat, wait to be signaled
        if (state[i] != eating)
            self[i].wait;
    }

    // Put down chopsticks
    Putdown(int i)
    {

        // indicate that I’m thinking
        state[i] = thinking;

        // if right neighbor R=(i+1)%5 is hungry and
        // both of R’s neighbors are not eating,
        // set R’s state to eating and wake it up by 
        // signaling R’s CV
        test((i + 1) % 5);
        test((i + 4) % 5);
    }

    test(int i)
    {

        if (state[(i + 1) % 5] != eating
            && state[(i + 4) % 5] != eating
            && state[i] == hungry) {

            // indicate that I’m eating
            state[i] = eating;

            // signal() has no effect during Pickup(),
            // but is important to wake up waiting
            // hungry philosophers during Putdown()
            self[i].signal();
        }
    }

    init()
    {

        // Execution of Pickup(), Putdown() and test()
        // are all mutually exclusive,
        // i.e. only one at a time can be executing
for
    i = 0 to 4

        // Verify that this monitor-based solution is
        // deadlock free and mutually exclusive in that
        // no 2 neighbors can eat simultaneously
        state[i] = thinking;
    }
} // end of monitor

0 ответов

Другие вопросы по тегам