餐饮哲学家饥饿的可能性

时间:2011-11-25 20:52:31

标签: c algorithm semaphore dining-philosopher

如果能够保证满足以下所有条件,我需要检查解决餐饮哲学家问题的算法:

  • 没有死锁的可能性。
  • 没有饥饿的可能性。

我在筷子上使用semaphore来解决问题。

这是我的代码(算法):

while(true)
{
    // He is Hungry
    pickup_chopsticks(i);

    // He is Eating...
    drop_chopsticks(i);

    // He is thinking
}

// ...

void pickup_chopsticks(int i)
{
    if(i % 2 == 0) /* Even number: Left, then right */
    {
        semaphore_wait(chopstick[(i+1) % NUM_PHILOSOPHERS]);
        semaphore_wait(chopstick[i]);
    }
    else /* Odd number: Right, then left */
    {
        semaphore_wait(chopstick[i]);
        semaphore_wait(chopstick[(i+1) % NUM_PHILOSOPHERS]);
    }
}

void drop_chopsticks(int i)
{
    semaphore_signal(chopstick[i]);
    semaphore_signal(chopstick[(i+1) % NUM_PHILOSOPHERS]);
}

我相信这里不存在死锁的可能性,但这里有可能出现饥饿问题吗?如果是,我该如何解决?

2 个答案:

答案 0 :(得分:17)

<强>解释即可。如果他没有等待不可用的信号量,哲学家启用执行是启用的哲学家所采取的无限步骤。执行是非常公平的如果每个哲学家无限启用通常需要无限多步。餐饮哲学家的解决方案是无饥饿 iff,在每次强烈公平的执行中,每个哲学家都会经常无限地用餐。

定理。每个无循环无死锁的餐饮哲学家解决方案,其中非餐饮哲学家不持有信号量是免费的。

证明。假设为了获得一个矛盾,即存在一种强烈公平的执行,其中一些哲学家,称他为菲尔,只是经常有限地用餐。我们证明这个执行实际上已经陷入僵局。

由于pickup_chopsticksdrop_chopsticks没有循环,因此Phil仅采取有限的步骤。最后一步是semaphore_wait,比如筷子i。因为执行非常公平,所以从一段有限的时间开始,筷子i必然是连续不可用的。让Quentin成为筷子的最后一个持有者。如果Quentin采取了无限的步骤,那么他会semaphore_signal筷子i,所以Quentin也采取了有限的步骤。反过来,昆汀正在等待筷子j,根据相同的论点,筷子j一直无法使用,直到时间结束并由(例如)罗伯特持有。通过在有限多的哲学家中追随semaphore_wait s链,我们必然会到达一个循环,这是一个僵局。

QED

答案 1 :(得分:5)

我多年没有用过这个,但是有一个工具可以用来验证你的算法。你必须在Promela中为你编写算法。

http://spinroot.com/spin/whatispin.html

http://en.wikipedia.org/wiki/Promela