首页 > 解决方案 > 单个进程/线程会导致死锁吗?

问题描述

我正在阅读 Galvin 的死锁概念,我怀疑单个进程/线程是否会陷入死锁......?因为定义(或者事实上加尔文的整个死锁章节)似乎并没有谈论如果系统中有一个进程/线程怎么办..(请告诉我是否错过了任何一点..虽然阅读它......如果是,真诚的道歉......对于我之前的陈述,但我根本无法在任何地方的章节中找到它......)

Galvin Book 在描述死锁场景时使用“其他”进程的每一个地方......所以我觉得我的问题的答案是不,单个进程/线程永远不会陷入死锁......(好吧,我也是:我的感受在某些情况下,单个进程可能会导致无限期等待..我可以将其称为死锁..?)

要知道我将死锁和无限期等待带入一张图片的动机..请阅读以下场景(好吧,请让我知道我是否正确假设无限期等待与死锁不同......我可能是错的..??) 考虑一个场景:有一个线程(t)和一个锁(l)。锁定性质 不可重入。(意思是当线程持有锁 l 然后它在释放它之前不能再次获取它......我只能在互联网上找到这个作为定义。)(还有一个条件:如果一个线程无法获取锁,那么它会阻塞自己直到它变得可用......是的,这是很明显的一点,但这一点正在造成混乱..请阅读下面以获得洞察力..)现在声称说 t 获得了一个锁 l 然后执行它,同时它再次需要相同的锁。 .

这种情况实际上是一个考试问题..其答案是:是的,带有单个锁的单线程可能导致死锁->我觉得与死锁定义冲突..)我知道我提出了很多疑问,但主要问题是相同的.

以下是我怀疑的要点总结:

- 单进程/有死锁?

-无限期等待与死锁

- 进程/线程是否有必要释放锁......何时进入阻塞/等待状态?

(首先感谢你做到这一点......因为这真的是一个很长的疑问......我这样做只是为了说明我的观点......如果不评论......我会再做一次...... )

标签: multithreadingprocessoperating-systemlocks

解决方案


单进程/有死锁?

是的,正如您所提到的,如果线程中的一个函数持有一个锁并递归调用自身,那么它可能会导致死锁。如果锁已经实现为不阻塞,当已经持有的线程请求锁时,那么当然不会出现死锁。

无限期等待与死锁

不,这些不是一回事。如果没有一个线程能够取得进展,就会发生死锁。如果一个线程(持有锁)能够在无限期地阻塞/延迟其他线程的同时取得进展,那不是死锁。另一个有趣的概念是活锁——线程没有取得进展但似乎是“活动的”/活动的。

进程/线程是否有必要释放锁..何时进入阻塞/等待状态?

不,例如,假设一个线程持有一个锁以保护内存页面不被其他线程访问,然后开始从磁盘读取该内存页面。此 I/O 很可能会暂停线程,直到从磁盘传输完成。这是对保持锁定和挂起的合法使用。有许多这样的情况,其中线程可以在持有锁的同时阻塞。


推荐阅读