首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程锁无限等待

线程锁无限等待
EN

Stack Overflow用户
提问于 2011-08-28 09:17:20
回答 2查看 649关注 0票数 1

面对出现作为应用挂起的间歇性多线程错误。当我暂停调试时,我会看到线程等待锁(_sync)子句。所以问题是:

  1. 是当其他线程锁定对象时等待锁定的唯一原因吗?
  2. 如何知道哪个线程持有特定对象的锁(在调试或运行时)?

我认为这不是“死锁”,因为死锁意味着至少存在两个对象和两个线程,而在考虑代码时只有一个同步对象。我认为其他线程锁定了对象并挂起,但我找不到它是哪一个线程。

EN

回答 2

Stack Overflow用户

发布于 2011-08-28 10:39:23

我将记录一些基本的调试技术。从Debug + Windows + Threads开始,它将显示进程中运行的所有线程的列表。您可以在Location列上悬停,您将得到显示线程堆栈跟踪的工具提示。这使您可以快速地进入实际运行代码的线程。双击感兴趣的一个,然后切换到Debug + Windows + Call Stack以获得更持久的视图。这可能会帮助您找到获得锁的线程。

否则,您可以找出哪个线程拥有锁对象。切换到被双击阻塞的线程,然后使用Debug + Windows +内存+内存1.在地址栏中键入"_sync“。右击窗口并选择“4字节整数”。从窗口左上角显示的十六进制地址中减去4,然后在“地址”框中键入该地址。或者单击滚动条向上箭头并查看第一行中的最后一个值。这是拥有锁的线程的Thread.ManagedThreadId。请注意,这并不总是有效的,对象中的这个字段也用于其他目的(例如,GetHashCode)。

知道线程的托管ID后,现在可以查看线程的Debug + Windows + thread窗口。但只有在VS2010上,早期版本才不会在此窗口中显示线程的托管ID。为此,您需要添加一些显示Thread.CurrentThread.ManagedThreadId值的跟踪代码。添加跟踪代码通常是解决线程问题的一种有用技术。这是非常危险的,然而,这段代码改变了时间,并可能使线程问题消失。许多跟踪侦听器也有一个隐含锁。

票数 4
EN

Stack Overflow用户

发布于 2011-08-28 09:37:50

调试这个功能(没有漂亮的VS2010功能)的一种方法是,只有使用属性/访问器才能访问_sync。有一些诊断文本或断点,你可以看到什么线程想要的是同步和什么时候。

除此之外,我不能在没有看到代码的情况下给出任何合理的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7220038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档