如何处理死线程(不是死锁)?

时间:2017-11-13 11:53:48

标签: windows multithreading networking architecture operating-system

在我们的应用程序中,有一个子系统侦听文件系统更改,包括通过网络进行的更改。有时,可能在网络处于压力之下时,监听线程可能会卡住。我强调,这里的讨论不是由不正确的线程同步引起的死锁。线程在第一次调用CreateFile或者随后调用File System API时卡住。问题是,如何处理这样一个线程。

我可以确定给定线程在某段时间内处于非活动状态,并终止它。但权威的人说这是非常糟糕的,虽然我不明白为什么保持死线程比终止它更好。然后我想,我至少可以释放线程中分配的一些资源,例如文件句柄。

所以我创建了一个线程清理器,它关闭文件句柄并释放死线程分配的内存。但很快我惊讶地发现,更干净的线程在调用CloseHandle API时陷入困境。我真的很震惊,因为我确信CloseHandle不会卡住。

现在我完全不知所措,因为如果应用程序继续工作足够长时间,并且网络或其中的一部分仍有问题,那么我最终会遇到很多死线程,占用大量系统资源!

1 个答案:

答案 0 :(得分:-1)

  

" Thread.Sleep(0)偶尔在生产代码中有用   高级性能调整。它也是一种出色的诊断工具   帮助发现线程安全问题:如果插入   Thread.Sleep(0)在您的代码中的任何地方创建或中断程序   几乎肯定有一个错误。"

请参阅sinon