问题标签 [deadlock]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1021 浏览

delphi - 关闭线程时死锁

我创建了一个类,它打开一个 COM 端口并处理重叠的读写操作。它包含两个独立的线程——一个读取数据,一个写入数据。它们都调用 OnXXX 程序(例如 OnRead 或 OnWrite)来通知已完成的读或写操作。

以下是线程如何工作的一个简短示例:

当您查看 Close() 过程时,您会看到它进入了临界区,终止了写入线程,然后等待它完成。由于写入线程在调用 OnWrite 方法时可以将要写入的新值排入队列,因此在调用 TAsyncSerialPort 类的 Write() 过程时,它会尝试进入相同的临界区。

在这里,我们陷入了僵局。调用 Close() 方法的线程进入临界区,然后等待写入线程关闭,同时该线程等待释放临界区。

我已经思考了很长时间,但我没有设法找到解决这个问题的方法。问题是我想确保当 Close() 方法离开时没有读/写线程处于活动状态,这意味着我不能只设置这些线程的 Terminated 标志并离开。

我该如何解决这个问题?也许我应该改变异步处理串行端口的方法?

提前感谢您的建议。

马吕斯。

--------- 编辑 ----------
这样的解决方案怎么样?

如果我的想法是正确的,这应该可以消除死锁问题。然而不幸的是,我在写线程关闭之前关闭了通信端口句柄。这意味着当它调用任何将通信端口句柄作为其参数之一的方法(例如,Write、Read、WaitCommEvent)时,应该在该线程中引发异常。我可以确定如果我在该线程中捕获该异常,它不会影响整个应用程序的工作吗?这个问题听起来可能很愚蠢,但我认为某些异常可能会导致操作系统关闭导致它的应用程序,对吧?在这种情况下我需要担心吗?

0 投票
9 回答
39638 浏览

java - java中的程序化死锁检测

如何以编程方式检测 Java 程序中发生了死锁?

0 投票
5 回答
1056 浏览

multithreading - 哪种类型的图表最适合可视化线程问题,例如争用?

在调试我们系统的问题时,我发现了导致瓶颈的线程争用。我需要向参与处理此问题的其他人解释这一现象。其中一些不是来自开发团队(然而,他们是相当技术性的)。那么什么类型的图表可以用来描述线程问题,例如争用、死锁等?一些例子会非常有用。

0 投票
4 回答
743 浏览

c# - 第 3 方 dll 中的死锁

我在我的两个 C# 应用程序中使用(和引用)两个 3rd 方 dll(a.dll 和 b.dll)。我遇到了一个可重复的问题,即两个应用程序在调用 3rd 方库中的函数时都挂起。

我试图复制 a.dll 和 b.dll(a2.dll 和 b2.dll)并在第二个应用程序中使用它,但事实证明 a.dll 引用 b.dll,anb b.dll 引用a.dll 并且无法正确加载。

我怀疑在 3rd 方库中存在死锁。我不能使用锁定来防止这种情况。每个应用程序都强制执行锁定以确保该应用程序一次只有一个线程访问库,但我无法锁定两个程序。

所以,我的问题是如何解决这个问题?

我可以告诉操作系统(Windows XP)我不想共享 dll 吗?

谢谢,乔

0 投票
4 回答
19061 浏览

c# - 如何调试死锁?

除此之外,我不知道现在是否可以重现它(我已经使用这个特定的应用程序一两个星期没有问题了),假设我在 VS 调试器中运行我的应用程序,如何死锁发生后我应该去调试它吗?我认为如果我暂停程序,我可能能够访问调用堆栈,因此可以查看不同线程在发生时的位置,但是单击暂停只会使 Visual Studio 陷入死锁,直到我杀死我的应用程序。

除了浏览我的源代码树来查找潜在问题之外,还有其他方法吗?一旦问题发生,有没有办法在调用堆栈中查看问题所在?任何其他可能有帮助的工具/提示/技巧?

0 投票
2 回答
127 浏览

java - Java 死锁挑衅

我正在用 java 做一些练习(你们中的一些人可能会猜想代码是从哪里来的)。我尝试使用以下代码引发死锁情况:

(javac -version javac 1.6.0_0 uname -a Linux inspiron 2.6.29 #1 SMP Sat May 16 10:56:17 CEST 2009 i686 GNU/Linux)

并获得(在其他情况下)以下输出:

我看错了什么?在 Thread-1 释放锁之前,Thread-0 怎么能在 read() 中进入临界区并获得 A 上的锁。这可能是因为输出不同步吗?此代码永远不会发生死锁。

0 投票
1 回答
3399 浏览

postgresql - PostgreSQL 独占锁停止应用程序

我的应用程序测试在数据库上非常困难。它们运行创建、删除和更改表语句。但是,即使在死锁的情况下,我仍然希望 postresql 能够处理这些问题(即检测锁并抛出一个线程)。我也没有同时运行请求。

但是,在我的情况下,它只是冻结了,我必须手动手动杀死它们(如果我稍微改变运行顺序,它会起作用,但这并不能给我信心)。锁表明 create table 语句具有排他锁,事务也具有排他锁。

有没有人经历过类似的事情?是否有任何服务器设置可以提供帮助?或者只是任何建议?

0 投票
5 回答
9435 浏览

sql-server - 如何解决非聚集索引上的插入/删除死锁?

我遇到了一个死锁问题,我发现它是由不同线程调用的两个存储过程引起的(两个称为 Web 服务)。

  1. Insert sp在 X 表中插入数据。
  2. Delete sp删除 X 表中的数据。

此外,我得到的结果告诉我在 X 表的非唯一和非聚集索引中发生了死锁。你有解决这个问题的想法吗?

更新

Read/Write deadlock,我认为由于以下语句而出错。

  • 在插入语句中,它获取 id(聚集索引),然后是非聚集索引。
  • 在 delete 语句中,它在 id 之前获取非聚集索引。

所以,我需要像下面的语句一样为删除语句选择 id。

PS。两个存储过程都在事务中调用。

谢谢,

0 投票
7 回答
19714 浏览

java - 如何检测死锁?同步块超时?

我正在调试一个运行多个线程的 Java 应用程序。看了一会儿日志后,似乎其中一个线程不再运行。我的猜测是线程正在等待一个永远不会释放的锁(最后一个输出是在调用同步方法之前)。

我可以为线程配置超时吗?一种“等待这个锁,但如果它在 10 秒后不可用,请不要再等待!”</p>

0 投票
1 回答
1199 浏览

java - 单个java信号量死锁?

在我最近的一个答案中,我给出了一个限制访问内存资源的理论信号量示例:

如果分配交错不好,我认为这可能是死锁的根源:

我的观察是真的吗?如果是,我怎样才能避免这种情况(例如定时等待和回滚)?