- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要检查我解决哲学家就餐问题的算法是否保证满足以下所有条件:
我正在使用 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]);
}
我确定这里没有死锁的可能,但是这里有没有可能出现饥饿问题呢?如果是,我该如何解决?
最佳答案
定义。哲学家启用当且仅当他没有在等待不可用的信号量。 执行 是由启用的哲学家采取的无限步骤序列。一次执行是非常公平当且仅当每个无限启用的哲学家经常采取无限多的步骤。哲学家就餐的解决方案是无饥饿当且仅当,在每个非常公平的执行中,每个哲学家都无限频繁地用餐。
定理。每个无循环无死锁的无用餐哲学家解决方案,其中非用餐哲学家不持有信号量是无饥饿的。
证明。为了得到一个矛盾,假设存在一个非常公平的执行,其中某个哲学家,称他为菲尔,只在有限的时间内用餐。我们证明这个执行实际上是死锁的。
由于 pickup_chopsticks
和 drop_chopsticks
没有循环,Phil 只需要有限的步数。最后一步是 semaphore_wait
,在筷子 i 上说。因为执行是非常公平的,所以从某个有限的时间开始,筷子 i 必然连续不可用。让 Quentin 成为筷子 i 的最后一个持有者。如果 Quentin 采取了无限多步,那么他将 semaphore_signal
筷子 i,因此 Quentin 也采取了有限多步。反过来,昆汀正在等待一根筷子 j,根据同样的论证,这根筷子在时间结束之前一直不可用,并由(比如说)罗伯特持有。通过遵循有限多个哲学家之间的 semaphore_wait
链,我们必然会到达一个循环,这是一个死锁。
QED
关于c - 用餐哲学家饥饿的可能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8274098/
考虑以下服务器: public class TestServer { public static void main(String[] args) { String ksName = "/so
我正在研究工作队列处理器的设计,其中 QueueProcessor 从队列中检索命令模式对象并在新线程中执行它。 我正在尝试解决嵌套命令可能导致死锁的潜在队列锁定场景。 例如 一个 FooComman
通过使用 UNIX 管道进行进程同步,我们是否会陷入饥饿?例如: void pipesem_wait(struct pipesem *sem) { char onebyte = 'A';
这是使用 Scala 2.8 Actors。我有一个可以并行化的长时间运行的工作。它由大约 650,000 个工作单元组成。我将它分成 2600 个不同的独立子任务,并为每个子任务创建一个新角色: a
回答问题:Task.Yield - real usages?我建议使用 Task.Yield 允许池线程被其他任务重用。在这样的模式中: CancellationTokenSource cts;
我是一名优秀的程序员,十分优秀!