据我了解:
首先,这些定义或多或少正确吗?如果是的话,它们也适用于单线程程序吗?例如:
// begin of useful work
until (some_buggy_condition_that_will_never_be_satisfied())
do_something();
// end of useful work
在上面的示例中,循环将永远执行,因为与共享资源无关的条件存在错误,并且永远不会被满足。所以线程:
因此该列表与我上面的活锁定义匹配,只是我在并发上下文之外使用该术语。这样可以吗?
需要多个线程才能拥有活锁。当交互线程系统不断重复某种备份和重试行为而不是执行任何工作时,我们称“活锁”。想象一个门口,想象两个或更多谄媚的绅士都想同时通过。但他们所做的只是轮流说:“不!在你之后,我坚持。”并且,没有人进过门。
无限循环不是活锁。在许多程序中,线程会永远循环执行有用的工作。我们只在没有完成任何工作时才说“活锁”。
需要多个线程才会出现 死锁。 当有一组线程,其中任何一个线程都无法执行任何操作,直到它获取该组中其他成员之一所占用的资源时,我们才说“死锁”保持。想象一座单车道桥,一排排的车辆想要从两个方向穿过,但每排前面的激进司机都坚定地坚持说:“我不会移动我的车辆,哪怕一英寸,除非你把你的车移开。 .”
饥饿有点像半个活锁。它具有相同的、连续的后退并重试循环,只不过该循环允许至少一个线程取得进展,同时阻止至少一个其他线程取得进展。