【问题标题】:deadlock caused by a cyle of locks ? unprobable event causing it or just a false intuition循环锁导致死锁?导致它的不可能事件或只是错误的直觉
【发布时间】:2018-03-05 20:43:56
【问题描述】:

非常感谢您的帮助。

我想了解真正导致我认为是死锁的原因:

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

我有一个 Couples 容器(列表),其中 Couples 就是:2 个单词和 1 个 Couple-Key。

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

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

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

情侣1:A B

情侣 2 : B C

第三组:C D

情侣 4 : D A

第五组:A E.

如果一个线程占用了 Couple 5,则占用 Couple 4 的线程将锁定 D 并等待,以此类推...到 Couple 2。

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

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

  • 一个线程优先于前一个(例如:嗯,我找不到,最后我认为它相当于同时有2个不同的线程有Coups A B和B A,并且每个线程锁定另一个只是,考虑到一个大循环,它发生的概率就和计算所需的时间占线程数的比例一样高。

我的分析对吗?

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

其实我有 10^5 Couples 10^4 Words。

谢谢,

纪尧姆

【问题讨论】:

  • 维基百科在“死锁”一文中将循环列为必要条件。不过,还有其他条件。
  • 10^4 个单词 你的单词是否都具有相同的使用频率?如果不是,您很快就会发现您的“对我来说不太可能”实际上非常接近 1.0。
  • 对我来说似乎不可能同时所有线程都陷入完全阻塞它们的特殊情况。我的意思是我们需要一个像 AB BC CD DA 这样的循环和 4 个线程同时锁定 A,另一个 B 另一个 C 和最后一个 D 在第一个想要锁定 B 第二个 C 第三个 D 之前的确切时刻和最后一个A。不可能像这样发生!?
  • 我不知道确切的重新分区,但显然不是统一的重新分区。我有大约 100 次,比如 10 对第一个词和第二个词相同的情侣(只有绑定键不同)。我确实觉得这是一个真正的僵局,正如你所说,除非我用我列表的一小部分进行测试,否则我经常被阻止。我坚持认为发生死锁对我来说根本不是问题,我想要更多的是解释为什么会发生。
  • 对我来说似乎不可能......你的大脑不像计算机那样工作,每秒可以执行数十亿次计算,可能至少 10-20 或其中甚至更多实际上同时发生。如果您基于“这似乎不可能”、“我认为我不需要担心”和“这永远不会发生”来编写代码,那么您最终会得到一个不起作用的系统。 我想要更多的是解释它为什么会发生因为它确实发生了,无论你是否觉得不可能。如果你说不可能发生的事情,那你就假设错了。

标签: multithreading graph locking deadlock cycle


【解决方案1】:

棘轮怪人这样回答我:

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

我不确定这一点,这解释了为什么我的死锁如此频繁地发生。

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

非常感谢,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2012-09-20
    • 2018-06-04
    • 2016-12-22
    • 1970-01-01
    相关资源
    最近更新 更多