由一轮锁引起的死锁 - 导致它的不可能事件或只是错误的直觉



非常感谢您的帮助。

我想了解是什么真正导致了我认为的僵局:

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

我有一个情侣的容器(列表),其中一对情侣就是:2 个单词和 1 个情侣键。

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

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

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

情侣 1 : A B

夫妇 2 : B C

夫妇 3 : C D

情侣 4 : D A

情侣5:A E。

如果一个线程采用情侣 5,则采用情侣 4 的线程将锁定 D 并等待,依此类推......到情侣 2。

我的直觉是,如果周期模式出现在我的情侣列表中,可能会出现某种形式的僵局。另一方面,如果不考虑以下事件之一,我无法构建一个解释死锁外观的示例:

  • 同时 2 个不同的线程具有夫妻 A B 和 B A,每个线程在同一时刻锁定另一个单词(对我来说不太可能)。

  • 一个线程优先于前一个线程(例如:好吧,我找不到任何线程,最后我认为它相当于同时 2 个不同的线程具有 Couples 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

多谢

最新更新