我有一个使用其他人的服务的程序。如果程序崩溃,关闭这些服务的最佳方法是什么?在服务器端,我将定义一些检查器来定期监视客户端是否无效。但是我们可以在客户端做任何事情吗?我不确定正常的 RAII 在这种情况下是否仍然有效。我的代码是用 C 和 C++ 编写的。
如果您的应用程序遇到严重崩溃,那么不,您精心设计的清理代码将不会运行,无论它是 RAII 范例的一部分还是您在末尾调用的方法。main
。没有一个应用程序的清理代码在导致应用程序终止的崩溃后运行。
当然,对于例外情况则不然。尽管这些最终可能导致应用程序终止,但它们仍然以受控方式触发此终止。通常,运行时库会捕获未处理的异常并触发终止。在此过程中,将执行基于 RAII 的清理代码,除非它也引发异常。然后你又回到了被毫不客气地从记忆中剔除的状态。
但即使你的应用程序的清理代码无法运行,操作系统仍会尝试在您之后进行清理。这解决了未释放内存、句柄和其他系统对象的问题。一般来说,如果你崩溃了,你不用担心释放这些东西。您的应用程序的状态不一致,因此尝试执行一堆清理代码只会导致不可预测且可能错误的行为,更不用说浪费大量时间了。只是崩溃,让系统来处理你的混乱。正如雷蒙德·陈所说:
该建筑正在拆除。不用费心扫地、清空垃圾桶和擦白板。并且不要在建筑物的出口处排队,这样每个人都可以将他们的进/出磁铁移出。你所做的只是让拆迁队等你完成这些毫无意义的清理工作。
做你必须做的事;跳过其他一切。
正如您在这个问题中所建议的,这种方法的唯一问题是,当您管理不受操作系统控制的资源时,例如另一个系统上的远程资源。在这种情况下,您无能为力。这best场景是使您的应用程序尽可能健壮,以免崩溃,但即使这也不是一个完美的解决方案。考虑一下断电时会发生什么,e.g.因为用户的猫把电线从墙上拉了下来。那时可能不会运行任何清理代码,因此即使您的应用程序从未崩溃,也可能会出现超出您控制范围的终止事件。因此,你的外部资源must在发生故障时保持稳健。超时是一种标准方法,也是比轮询更好的解决方案。
根据特定用例,另一种可能的解决方案是在应用程序中运行一致性检查和清理代码初始化。您可能会对旨在连续运行并在终止后立即重新启动的服务执行此操作。下次重新启动时,它会检查其数据和/或外部资源的一致性,根据需要释放和/或重新初始化它们,然后继续正常运行。显然,对于典型的应用程序来说,这是一个糟糕的解决方案,因为无法保证用户会及时重新启动它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)