通过超时避免死锁

时间:2018-04-05 14:21:46

标签: .net multithreading thread-synchronization

我刚刚阅读了 ReaderWriterLock 类的MSDN文章。 ReaderWriterLock类上允许我们获取锁的方法在调用时都需要超时值。 MSDN文章解释说,此超时值用于避免死锁:如果发生死锁,应用程序将在锁定超时时抛出ApplicationException。

然后,MSDN文章继续说:

  

线程可以捕获此异常并确定接下来要采取的操作。

在我看来,以一种允许应用程序继续运行的方式处理上面的ApplicationException是非常困难的,就好像没有发生任何重要事件一样。我一直认为必须以不会发生死锁的方式设计多线程应用程序。期。如果发生死锁,则必须将其视为设计缺陷或错误。

我的假设是正确的还是使用超时作为保持应用程序前进的一种方式是完全正常的?

供参考:MSDN article

1 个答案:

答案 0 :(得分:1)

这实际上取决于应用程序。在某些情况下,不惜一切代价继续运行并丢弃因任何原因而无法工作的数据或任务,包括被阻止尝试获取锁定,这一点更为重要。例如,控制灯光和加热的实时系统永远不会失败,因为它无法锁定日志文件。

在其他情况下,数据完整性是最重要的考虑因素,一旦以某种意外的方式失败,快速停止应用程序是至关重要的。

另外请记住下一步采取的行动"可能是退出并重新启动应用程序。该操作也可能是在重新启动之前记录故障和导致故障的步骤,因为知道这将有助于某人调试它为何陷入僵局。