常规无限循环算作活锁吗?

问题描述 投票:0回答:1

据我了解:

  • 活锁:线程不会取得进展,但它会永远执行(线程无限活动):例如,它处于循环中无限地尝试访问永远不会再次可用的共享资源。
  • 死锁:线程没有取得进展,但它甚至没有执行(线程无限休眠,因此死亡):它正在等待操作系统基于永远不会发生的条件唤醒。
  • 饥饿:一个线程没有进展并且阻塞(就像死锁一样),但是等待被唤醒的情况确实发生了,只是碰巧有其他线程总是在我之前取代我的位置。

首先,这些定义或多或少正确吗?如果是的话,它们也适用于单线程程序吗?例如:

// begin of useful work
until (some_buggy_condition_that_will_never_be_satisfied())
    do_something();
// end of useful work

在上面的示例中,循环将永远执行,因为与共享资源无关的条件存在错误,并且永远不会被满足。所以线程:

  • 正在执行。
  • 为了做有用的工作,循环必须结束
  • 循环永远不会结束,因为结束的条件永远不会满足

因此该列表与我上面的活锁定义匹配,只是我在并发上下文之外使用该术语。这样可以吗?

multithreading
1个回答
0
投票

需要多个线程才能拥有活锁。交互线程系统不断重复某种备份和重试行为而不是执行任何工作时,我们称“活锁”。想象一个门口,想象两个或更多谄媚的绅士都想同时通过。但他们所做的只是轮流说:“不!在你之后,坚持。”并且,没有人进过门。

无限循环不是活锁。在许多程序中,线程会永远循环执行有用的工作。我们只在没有完成任何工作时才说“活锁”。

需要多个线程才会出现 死锁。 当有一组线程,其中任何一个线程都无法执行任何操作,直到它获取该组中其他成员之一所占用的资源时,我们才说“死锁”保持。想象一座单车道桥,一排排的车辆想要从两个方向穿过,但每排前面的激进司机都坚定地坚持说:“我不会移动我的车辆,哪怕一英寸,除非你把你的车移开。 .”

饥饿

有点像半个活锁。它具有相同的、连续的后退并重试循环,只不过该循环允许至少一个线程取得进展,同时阻止至少一个其他线程取得进展。

© www.soinside.com 2019 - 2024. All rights reserved.