【发布时间】:2009-02-19 02:55:19
【问题描述】:
我正在开发一个客户端服务器应用程序。在某些时候,在某些机器上,当有超过 5 个客户端请求数据时,它似乎会达到死锁。如果我介入调试问题,那么程序似乎正在处理中。只需在我知道程序正在执行的地方设置一个断点,并使其多次到达断点即可完成。如果我在代码中的某些点插入 Thread.Sleep(0),主要是围绕一些 cpu 密集型循环,它似乎几乎可以完全解决问题。我现在遇到的一个问题是,如果我过多地调用 Thread.Sleep(0),它会减慢代码的速度。如果我调用它不够,代码似乎陷入僵局。虽然我可以验证它没有陷入死锁,因为如果我进入代码,它会导致问题消失,仅仅是因为我正在暂停一个线程。
有没有一种好方法可以准确追踪造成这种情况的原因。似乎它只发生在运行 Vista 的笔记本电脑上,而不发生在运行 Windows XP 的桌面上。但是,调试是不可能的,因为仅仅单步执行代码就会导致问题消失。我读过 cmets 说调用 Thread.Sleep(0) 是一种不好的做法,而且不应该是必要的,而且我不喜欢将巫术类型代码放入我不明白为什么必须存在的应用程序中.任何指针将不胜感激。
[编辑] 我还可以验证代码在“死锁”时是否仍在运行,因为如果我将其放置足够长的时间,它就会完成,只是它所花费的时间要高出许多数量级。我的意思是,当它处于这种“死锁”模式时,它实际上至少慢了 100 倍。 CPU 固定在 80-95%,所以它正在工作,尽管它正在做的事情超出了我的范围,因为完成任务需要很长时间。
[更多信息] 只是因为这里的每个人都坚持认为这是一个死锁,所以我删除了所有执行任何锁定的代码。只有几行代码可以进行任何锁定。线程在大多数情况下完全独立工作,因此完全移除锁定并没有太多工作。问题仍然存在。我的代码中不再有同步锁,不再有互斥锁,我看到的任何东西都不会导致死锁,但问题仍然存在。而且它没有陷入僵局。它运行,尽管速度很慢,尽管它占用了所有的处理器资源。
【问题讨论】:
-
你能把代码贴出来吗?
-
抱歉,要发布很多代码,我似乎无法用一点代码重新创建。
-
出现问题的机器是多 CPU 的机器还是没有单 CPU 的机器?这可能会暴露许多多线程资源争用问题。
-
不,两者都是单 CPU 机器。出现“死锁”的机器是 Celeron M 1.7 GHz,没有任何问题的机器是 Athlon 3200。
-
如果性能在一段时间内自行解决,这不是死锁。死锁是指两个(或更多)线程各自持有另一个需要的锁,因此两者都无法继续执行其代码(直到不同的线程杀死一个或多个死锁线程)。
标签: .net multithreading