Answers:
这取决于锁的实现方式。如果按照Wikipedia文章中的方法进行操作,即在每个进程中用一个布尔值来保护关键部分¹,则肯定会遇到麻烦。如果一个进程死亡,它将永远不会重置其标志,因此另一个进程将永远循环。
在实践中,您可以保护您的代码免受多种死亡之害。例如,采用以下Java风格的实现:
flag[1] = true;
turn = 1;
while ( flag[0] == true && turn == 1 ) { Thread.yield(); }
try {
// critical section
}
finally {
flag[1] = false;
}
只要系统正在处理错误,这将确保在关键部分发生的任何情况下都将标志重置。在Java中,即使对于堆栈和堆溢出也是如此。因此,除非该过程确实消失(kill
²,处理器故障,网络断开等),否则您是安全的。请注意,在这种情况下,大多数非关键软件都会失败-如果未运行,该如何处理错误?-因此在许多情况下必须接受。如有必要,可以在重新启动时处理不一致问题。
如果您使用适当的语言级别的锁,则运行时系统可能会处理消失的锁所有者,即使用死所有者释放锁。您可以通过给每个进程一个死人的开关让其他人可以读取的开关来模拟自己,或者直接检查拥有锁的进程是否仍然存在(如果系统支持)。
finalize
即使在上也应该执行kill
,但是规范对此没有保证。kill -9
对于任何需要垂死的进程做某事的解决方案,可能都是死刑。