监控线程

时间:2018-12-04 09:59:14

标签: c# multithreading

我有一个产生多个线程的应用程序。每个线程都有相当复杂的逻辑。有时存在死锁或其他问题,我想通知Thread不再处于“健康”状态。

我想到的选项:

  1. 记录和监视日志
  2. 从每个线程更新内存中的共享对象(例如,以线程ID为键和状态结构的字典:确定,时间跨度,然后在单独的线程中观察该字典,如果线程未更新X分钟,则它的状态表示出了什么问题)

但是我感觉这不是最好的解决方案。是否有监视线程的良好实践?也许线程本身可以使用时间戳更新它的全局状态,并且进程可以访问该信息?

1 个答案:

答案 0 :(得分:0)

在这里,我将概述一些想法。

1使您的代码更健壮

显然,保持线程健康的最简单方法是解决所有这些不健康的状态,如果遇到死锁,请更适当地使用锁和信号灯,调试死锁发生的原因并找到解决这些不良情况的方法场景。

2个代理和错误处理程序

与上述相关,如果您可以正确地识别这些问题而又不能解决它们,则可以建立一个线程可以知道其处于危险状态的系统,并实施一个在该系统中,该线程可以说出向主线程的消息,说它处于错误状态,然后主线程可以关闭受影响的线程,从设置的“安全状态”启动一个新线程,然后尝试从那里继续。像Elixir这样的基于多进程的语言都非常喜欢这种保护方式。

3记录/轮询

如果确实没有办法让您知道发生了什么/如何进行(有时总是太难了),那么在设定的时间范围内更新共享资源的线程是很容易实现的事情。每隔一分钟让线程更新一次浮点数,精确到自上一次更新浮点数以来的时间,让主线程每隔几分钟检查一次该浮点数((如果您的线程太忙而无法按时更新它,请留大量空间) 。如果说5分钟没有更新,那么您可以肯定地确定您的线程已死锁。如果您希望事后能够看到此消息,那么您也可以将这些更新消息复制到日志文件中,并使用堆栈跟踪该时间以查看其卡住的地方

结论

总而言之,如果您可以修复/可靠地确定何时发生错误/受感染状态,则可以编写代码来说明这些不良状态,如果您不能这样做,那么下一个目标应该是明确在哪里可以做到。