首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是“锁序反转”?

什么是“锁序反转”?
EN

Software Engineering用户
提问于 2021-04-01 10:01:13
回答 2查看 2.5K关注 0票数 10

我正在调查埃里克·利珀特的回答到这个堆栈溢出问题

在他的回答中,他对死锁使用了“锁顺序反转”这个短语。我在网上搜索过,发现了优先级倒置。这是同一个概念吗?如果没有,那么锁定顺序反转究竟是什么?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2021-04-01 11:20:01

当多个线程获得多个锁时,在某些情况下保证进度的唯一方法是确保锁总是按照相同的顺序进行。

在两个锁和两个线程的基本情况下,一个锁可以指定为锁A,一个锁可以指定为锁B。

如果线程1捕获了锁A,那么线程2将在锁A等待直到线程1释放它。当线程2在锁A等待的时候,线程1可以自由地前进,也可以抓住锁B。在某个时候,线程1会释放锁A(不管是在释放B之前还是之后,这都不重要),然后线程2将继续进行。如果Thread 1出于任何原因想要重新获得锁A,那么它只会在第一次释放Lock B之后才会这样做。这是正确的顺序,因为它不涉及死锁的风险。A总是在B之前取的。

在倒序的情况下,Thread 1建议在B之前扣押A,而Thread 2则建议在A之前抢占B,只要有适当的时间,就会出现这样的情况:每个人都已扣押了他们建议采取的第一个锁,但每个锁也需要进入另一个锁才能继续。这是一种僵局。

对于任何知道信号原理的人来说,铁路类比可能是最简单的。如果火车只沿着铁轨走一条路,它们就永远不会陷入僵局。但如果允许一列火车从两端进入单轨段,即使另一列列车已经从另一端进入,那么最终其中一列列车将不得不倒车,以便让另一列列车通过。在实践中,这样的单轨部分被视为一个不可分割的整体--如果一列火车从任何一端进入,那么整个路段上就会有一个锁,而整个路段只有一个锁。

当将并发编程作为一门科学来处理,并且可以以冲突的方式持有锁时,就定义了锁的顺序(或层次结构),并且所有代码都必须以与该顺序或层次结构一致的方式捕获锁。只有当你准备好处理随之而来的僵局时,才有可能违背秩序。

同时,调度中的“优先级反转”则完全是另一回事。再一次回到铁路类比,它是把快车停在铁轨上,让慢速列车通过,这有悖于快/慢优先顺序。

票数 7
EN

Software Engineering用户

发布于 2021-04-01 10:47:10

不,这些不一样。

优先级反转不会导致死锁。优先级反转使优先级较低的进程执行,而优先级较高的进程被阻塞,因为另一个优先级较低的进程占用了锁。这不是一个死锁,并不是所有的参与者进程都是锁定的,而且是向前推进的。

当两个或多个进程试图以不同的顺序获取锁时,锁顺序反转可能会导致死锁,因此每个进程都持有另一个进程试图获取的锁。

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/425016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档