我不会说资源匮乏是活锁的特例。通常:
一个很好的解释:http ://docs.oracle.com/javase/tutorial/essential/concurrency/starvelive.html 。但我知道术语的选择可能会有所不同。
说到饥饿,我听到的定义是:
假设可以指定与假设(信号量语义、操作系统调度程序行为...)一致的无限执行路径(交错),使得线程 T 暂停等待某些资源并且永远不会恢复,即使它可能无限多次. 那么T被称为饥饿。
但实践与此不符。假设两个线程在一个无限循环中执行相同的临界区。您的同步代码允许第一个线程每小时进入临界区一次。是饿死了吗?两个线程都被允许进行,但第一个线程正在痛苦地缓慢地完成它的工作。
最简单的饥饿源是弱信号量。如果您使用行为相似的同步原语(或构建您自己的),则会导致饥饿。
饥饿是众所周知的经典问题:
欲了解更多详情,我衷心推荐 The Little Book of Semaphores(免费):http ://www.greenteapress.com/semaphores/ 。
您在问是否每次饥饿都是由于等待某些资源引起的。我会说——是的。
一个线程可以被挂起:
(1) 在某些阻塞系统调用上 - 等待/获取互斥锁、信号量、条件变量;写(),轮询()等。
(2) 在一些非阻塞操作上——比如执行计算。
饿死 (1) 就是饿死资源(互斥体、缓冲区等)。
饿死 (2) 就是饿死 CPU - 您可以将其视为资源。如果发生这种情况,则问题出在调度程序上。
高温高压