作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是“多处理器编程的艺术”中两个线程的互文本实现
private int victim;
// thread-local index, 0 or 1
public void lock() {
int i = ThreadID.get();
victim = i; // let the other go first
while (victim == i) {} // spin
}
public void unlock() {}
最佳答案
我的理解可能有缺陷,在这种情况下,有人希望能够澄清(cc @SonarJetLens)。
在一个线程完全领先于另一个线程的情况下,例如,线程 A 获取锁并等待,因为它是受害者。它无限期地等待直到线程 B 出现并将自己设置为受害者,从而让 A 进入其临界区。在这种情况下,我没有看到任何死锁发生:根据定义,死锁是指任何线程没有取得任何进展。
但是,请考虑线程 A 从不尝试重新获取锁的情况。在这种情况下,线程 B 将无限期地等待,永远无法到达它的临界区。对我来说,这看起来更像是饥饿,这意味着线程 B 被饿死并且永远无法获取线程。
如果程序在那里结束,那么线程 A 通过执行它的临界区已经取得了一些“进展”,而线程 B 没有,因此没有死锁。但是,存在饥饿,因为线程 B 试图获取锁但从未成功,因此与饥饿自由的定义相矛盾。
我希望这是有道理的,我没有在这里犯任何术语或定义错误,我真的希望有人澄清:)。
关于locking - 来自 "The Art of Multiprocessor Programming"的 LockTwo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17133394/
我是一名优秀的程序员,十分优秀!