Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 通过超时避免死锁_.net_Multithreading_Thread Synchronization - Fatal编程技术网

.net 通过超时避免死锁

.net 通过超时避免死锁,.net,multithreading,thread-synchronization,.net,Multithreading,Thread Synchronization,我刚刚浏览了ReaderWriterLock类的MSDN文章。ReaderWriterLock类上允许我们获取锁的方法在调用时都需要超时值。MSDN文章解释了此超时值用于避免死锁:如果发生死锁,应用程序将在锁超时时抛出ApplicationException MSDN文章接着说: 线程可以捕获此异常并确定下一步要采取的操作 在我看来,要以一种允许应用程序继续运行的方式来处理上面的ApplicationException是非常困难的,就好像没有发生什么重要的事情一样。我一直认为,多线程应用程序的设

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

MSDN文章接着说:

线程可以捕获此异常并确定下一步要采取的操作

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

我的假设正确吗?或者使用超时作为保持应用程序继续运行的一种方式是完全正常的吗


仅供参考:

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

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


还请记住,“下一步操作”可能是退出并重新启动应用程序。操作也可能是在重新启动之前记录故障以及导致故障的步骤,因为知道这将有助于某人调试故障为何会死锁。

只有在可以对错误采取措施的情况下,您才应该捕获异常。如果你无能为力,那就让更高层的人来处理吧。(记录、回滚事务等,都算作“做点什么”)…NET1.0有很多设计错误,ApplicationException就是其中之一。还有几个与线程相关的大错误,Thread.Suspend()可能是最大的错误。每个人都需要训练轮。他们在ReaderWriterLockSlim上没有犯同样的错误,请注意,文章建议改用它。是的,如果你被困在RWL上,那么无限是正确的选择。让您有很多时间附加调试器或进行小型转储,以找出哪里出了问题。