gpt4 book ai didi

c# - 线程锁无限等待

转载 作者:太空宇宙 更新时间:2023-11-03 22:09:22 26 4
gpt4 key购买 nike

面临间歇性多线程错误,表现为应用程序挂起。当我暂停调试时,我看到线程等待 lock(_sync) 子句。所以问题是:

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

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

最佳答案

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

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

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

关于c# - 线程锁无限等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7220038/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com