非常感谢你的帮助。
我想知道是什么真正导致了我认为的死锁:
我有标准对象,我们称之为'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个单词。
谢谢,
纪尧姆
棘轮怪胎回答我:
重要的是要记住,在锁定一个单词和锁定下一个单词之间,可以中断一个进程,或者另一个进程可以简单地更快并锁定第二个单词。
我不确定这一点,这解释了为什么我的死锁经常发生。
https://cs.stackexchange.com/questions/88936/deadlock-caused-by-a-cyle-of-locks-unprobable-event-causing-it-or-just-a-false
多谢了,