【问题标题】:Is waiting for an event that will never trigger a deadlock?是在等待一个永远不会触发死锁的事件吗?
【发布时间】:2010-12-27 16:11:16
【问题描述】:

死锁通常意味着线程(或进程)A在等待线程B,同时线程B也在等待线程A。

目前我在我们的应用程序中遇到了类似的情况。线程 A 正在等待线程 B 设置事件。但是,线程 B 等待线程 A,它只是不会设置事件(无论出于何种原因)。我想知道这种情况是否也可以称为“死锁”,或者还有其他术语吗?

【问题讨论】:

    标签: multithreading concurrency terminology


    【解决方案1】:

    我会称之为错误或糟糕的设计。但如果一个线程还在运行,则不是死锁。

    【讨论】:

      【解决方案2】:

      严格来说,不,这不是死锁,这就是您最初所说的(除了通常可能有一个完整的线程循环,每个线程都在等待下一个锁:A->B->...->Z ->A)。

      我想你可以称之为resource starvation,但这是一个相当笼统的术语,也涵盖了死锁。

      【讨论】:

        【解决方案3】:

        我称之为starvation(资源是CPU),而不是deadlock

        【讨论】:

          【解决方案4】:

          是的 - 我也将其称为死锁。

          但是,只有一个线程(线程 A)会受到影响,而不是整个应用程序。

          【讨论】:

          • 我会说 A 是停止的,而不是死锁的。但这确实是语义上的争论。
          • 尼尔说了什么。我想说死锁是两个(或更多)进程在等待彼此完成后才能继续。无限期阻塞(即Thread.Sleep(-1))不是死锁。
          • 谢谢。看来我误解了定义。
          【解决方案5】:

          这是我的观点:

          死锁是程序的全局状态不再进行的情况。 如果 A 被阻塞,但程序仍然可以终止,因为 B 可能找到解决方案,这不是死锁。

          【讨论】:

          • 死锁是指程序的全局状态不再进行的情况。:这个定义也适合“活锁”的情况。
          • 嗯嗯……是的。我只是想回答这个问题,你提到的部分是陷入僵局的必要条件。在 bytepusher 的问题中,它没有得到满足。这并不意味着满足这个条件的一切都是僵局。就像汽车通常有 4 个轮子一样,但所有有 4 个轮子的车辆不一定都是汽车......(好吧我明白你的意思,我不得不回答一些问题)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-20
          • 2011-11-19
          • 1970-01-01
          • 2020-06-06
          • 2021-06-05
          • 1970-01-01
          相关资源
          最近更新 更多