提问者:小点点

死锁是由一堆锁造成的?不可能的事件导致的还是只是错误的直觉


非常感谢你的帮助。

我想知道是什么真正导致了我认为的死锁:

我有标准对象,我们称之为'Words',包含3个字母和一个键;(这对我的问题并不重要)

我有一对夫妇的容器(列表),其中一对夫妇简单地说:2个单词和1对夫妇-钥匙。

我有一个函数,假设对夫妇列表进行一些计算,它可能会在计算过程中修改字母和键,但是当计算完成时,我们可以储存结果并将其重置为初始值。

考虑到一个使用并行for循环来获取我所有夫妇的结果的代码。这在调用getResult()函数之前对第一个单词使用锁,然后对第二个单词使用锁,为什么会发生死锁?

我的第一个想法是,如果我们有:

情侣1:A B

情侣2:B C

情侣3:C D

情侣4: D A

情侣5: A E.

如果一个线程采用耦合5,则采用耦合4的线程将锁定D并等待…到耦合2。

我的直觉是,如果循环模式出现在我的情侣列表中,某种程度上可能会发生死锁。另一方面,如果不考虑以下事件之一,我无法建立一个解释死锁出现的例子:

>

  • 同时两个不同的线程有一对A B和B A,每个线程同时锁定另一个单词(对我来说很不可能)。

    一个线程优先于前一个线程(例如:我找不到任何线程,最后我认为这相当于两个不同的线程同时拥有A B和B A对,每个线程同时锁定另一个单词。只是,考虑到一个大周期,它发生的概率与计算所需的时间占线程数的比例一样高。

    我的分析对吗?

    如果最终死锁的原因不是由于“同时”事件,我很高兴知道是什么原因导致的,或者如果根据线程数或周期长度等讨论更精确的死锁概率出现…

    事实上,我有10^5对夫妇10^4个单词。

    谢谢,

    纪尧姆


  • 共1个答案

    匿名用户

    棘轮怪胎回答我:

    重要的是要记住,在锁定一个单词和锁定下一个单词之间,可以中断一个进程,或者另一个进程可以简单地更快并锁定第二个单词。

    我不确定这一点,这解释了为什么我的死锁经常发生。

    https://cs.stackexchange.com/questions/88936/deadlock-caused-by-a-cyle-of-locks-unprobable-event-causing-it-or-just-a-false

    多谢了,