问题标签 [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 投票
13 回答
6578 浏览

visual-studio-2008 - 如何停止右键单击死锁 Visual Studio 2008

我在使用 Visual Studio 2008 时遇到了一个非常严重的问题。有时,当我在调试时右键单击(用于转到定义、设置下一条语句等),Visual Studio 只会死锁并进入无响应模式。

有没有人有同样的问题?有谁知道如何解决它?

编辑:我正在使用带有几个热修复程序的 SP1。

0 投票
6 回答
1944 浏览

sql-server-2000 - 我可以在 Nunit 中创建数据库死锁测试吗?

在这个 asp.net 中,我正在清理可能会发生死锁。我想确保代码正确处理它们,所以我正在尝试编写触发死锁的 NUnit 测试.....

DAO 按实体拆分。每个实体都有一组测试,它们被 Startup() 和 Teardown() 方法包围,这些方法创建一个事务范围,然后在测试完成后将其回滚。这对其他一切都很好,但对于死锁完全没用。

如何使用可以可靠复制的 TransactionScope 和 SQL2000(即涉及 MSDTC)设置和运行“死锁”测试?更多细节:我知道有一种情况,如果两个用户使用不同的、特定的数据值调用两个函数,那么可能会导致死锁。我怎样才能在 NUNIT 中模拟这个 - 并让死锁总是发生?

是的,我确实从“你为什么不首先阻止死锁发生”行动计划开始,但我无法控制可能发生死锁的代码 - 我只是调用函数,它们可以死锁.

0 投票
8 回答
124591 浏览

multithreading - 递归锁(互斥锁)与非递归锁(互斥锁)

POSIX 允许互斥体是递归的。这意味着同一个线程可以两次锁定同一个互斥体并且不会死锁。当然也需要解锁两次,否则其他线程无法获得互斥量。并非所有支持 pthread 的系统也支持递归互斥锁,但如果它们想要符合 POSIX 标准,它们必须.

其他 API(更高级的 API)通常也提供互斥锁,通常称为锁。一些系统/语言(例如 Cocoa Objective-C)同时提供递归和非递归互斥锁。有些语言也只提供一种或另一种。例如,在 Java 中,互斥锁总是递归的(同一个线程可能在同一个对象上“同步”两次)。根据它们提供的其他线程功能,没有递归互斥锁可能没有问题,因为它们可以很容易地自己编写(我已经在更简单的互斥锁/条件操作的基础上自己实现了递归互斥锁)。

我不太明白:非递归互斥锁有什么用?如果它两次锁定同一个互斥锁,为什么我会想要一个线程死锁?即使是可以避免这种情况的高级语言(例如测试这是否会死锁并抛出异常)通常也不会这样做。他们会让线程死锁。

这仅适用于我不小心将其锁定两次并且仅将其解锁一次的情况,并且在递归互斥锁的情况下,将更难找到问题,因此我立即将其死锁以查看不正确的锁定出现在哪里?但是我不能在解锁时返回一个锁计数器做同样的事情吗?在我确定我释放了最后一个锁并且计数器不为零的情况下,我可以抛出异常或记录问题吗?还是我没有看到其他更有用的非递归互斥锁用例?或者它可能只是性能,因为非递归互斥体可能比递归互斥体稍微快一点?但是,我对此进行了测试,差异确实没有那么大。

0 投票
16 回答
43965 浏览

java - Java中的死锁检测

很久以前,我从一本Java参考书中保存了一句话:“Java没有处理死锁的机制,它甚至不知道发生了死锁。” (Head First Java 第 2 版,第 516 页)

那么,它是怎么回事呢?有没有办法在 Java 中捕获死锁情况?我的意思是,有没有办法让我们的代码理解发生死锁的情况?

0 投票
5 回答
6923 浏览

python - 出于测试目的,如何在 MySQL 中导致死锁

我想让我的 Python 库与 MySQLdb 一起使用能够检测死锁并重试。我相信我已经编写了一个很好的解决方案,现在我想对其进行测试。

对于我可以使用 MySQLdb 运行以创建死锁条件的最简单查询的任何想法是什么?

系统信息:

  • MySQL 5.0.19
  • 客户端 5.1.11
  • 视窗
  • Python 2.4 / MySQLdb 1.2.1 p2
0 投票
4 回答
2806 浏览

asp-classic - 经典 ASP:“应用程序”全局对象会导致死锁吗?

经典 ASP中,有一个名为“应用程序”的全局对象,所有会话都可以同时访问它。

由于“应用程序”对象是共享资源,它会导致死锁吗?

编辑:如果没有,为什么它有锁定解锁方法?参考

0 投票
5 回答
2401 浏览

.net - 如何在 windbg 中找到我的 ReaderWriterLock 的锁持有者(阅读器)

我有一个由于死锁而挂起的 .Net 进程的转储(gui 线程不再响应,我的日志显示某些线程已停止响应)。我已经拍了一张快照,现在正在windbg中查看它,所有线程都在等待最后一个。用 !clrstack -p 查看那个线程的堆栈跟踪,我可以看到它正在尝试获取对 ReaderWriterLock 的写入

我如何知道哪个其他线程持有该锁,以便我可以开始弄清楚死锁是如何发生的?

谢谢

[编辑] .Net1.1 sos.dll 中显然有一个命令 !rwlocks 可以帮助解决这个问题,但 .Net2.0 版本中没有。狩猎继续

0 投票
4 回答
35330 浏览

c# - 如何使用 ADO 在 C# 中获得高效的 Sql Server 死锁处理?

我有一个作为 ADO.net 包装器的“数据库”类。例如,当我需要执行一个过程时,我调用 Database.ExecuteProcedure(procedureName, parametersAndItsValues)。

我们在 SQL Server 2000 中遇到了死锁情况的严重问题。我们团队的一部分正在研究 sql 代码和事务以尽量减少这些事件,但我正在考虑使这个数据库类对死锁情况具有鲁棒性。

我们希望死锁受害者在延迟一段时间后重试,但我不知道这是否可能。这是我们使用的方法的代码:

我可以在 catch 块内进行此处理吗?

0 投票
6 回答
25816 浏览

sql-server - 在 MS SQL 上的更新查询中减少 PAGE 级别的死锁

在默认的“READ COMMITED”事务下,在一个简单的普通表上,一个愚蠢的简单 SQL UPDATE 查询导致了一些有趣的死锁。

PKvarchar(11),上面有一个聚集索引。表上没有触发器或表关系..等。

我做了一些检查,发现死锁发生在“PAGE”级别,而不是 ROW/记录级别。然后,我发现对于每个更新查询,确实需要 100 个(甚至更多)页锁。(这对我来说没有意义,因为我一次更新一行)

有什么办法可以防止死锁的发生吗?或者,如何在不使用游标的情况下减少单行更新所需的锁数?

--

谢谢你的建议。

我曾尝试用高填充因子和低填充因子重建索引几次。我曾试图让进程更新不同的位置/切片。但没有任何改善或最坏的情况。

--

我尝试了 SQL Server Profiler。我捕获了一些“Lock:Deadlock Chain”和“Lock:Deadlock”,但没有捕获“Deadlock Graph”。双方都在读取提交、自动提交模式下进行简单的更新查询。

0 投票
2 回答
1108 浏览

c++ - DirectShow 的 eof 检测

有没有办法检测 DirectShow filtergraph 已经到达其文件的末尾?在其文件末尾,我的意思是带有 SampleGrabber 过滤器的过滤器图将永远不会收到另一个 SampleCB 调用。

以下是一些不起作用的事情:

  • 信任IMediaDet::get_StreamLength(通常说视频中的帧数比实际存在的帧数多)
  • 信任IMediaSeeking::GetDuration(与IMediaDet一致,+/-一帧)
  • 使用IMediaControl::GetState(即使文件中的所有帧都已处理完毕,过滤器图仍会运行)

背景:

我正在做视频处理,我有一个类可以用 SampleGrabber 创建一个过滤器图。每当SampleGrabber::SampleCB被调用时,我都会用互斥锁阻止它,这样我就可以在拉模式下运行过滤器图。当我准备好另一帧时,我在我的主线程中取消阻塞互斥锁并等待SampleGrabber::SampleCB向我发送它已完成的信号。对于某些视频,IMediaDet::get_StreamLength告诉我视频的帧数比实际存在的帧数多。一旦我提取了最后一帧并请求比实际存在的帧多一个,主线程就会永远阻塞,因为SampleGrabber::SampleCB永远不会再被调用。我希望能够检测到SampleGrabber::SampleCB永远不会调用文件源。像 Windows Media Player 这样的应用程序能够以某种方式做到这一点,因为 GUI 报告视频在最后一个真实帧之后结束,所以显然有一种方法可以做到这一点。

编辑:

WaitForSingleObject用来实现主线程阻塞。到目前为止,我一直在使用的解决方法是按照 Greg 的建议:有一个有限的超时。不幸的是,这有点棘手。等待失败的原因有很多,例如真正的 eof、慢速网络文件系统、丢失网络连接、慢速解码器等。