- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个使用他人服务的程序。如果程序崩溃,关闭这些服务的最佳方法是什么?在服务器端,我会定义一些检查器来监视客户端是否定期无效。但是我们可以在客户端做任何事情吗?我不确定正常的 RAII 在这种情况下是否仍然有效。我的代码是用 C 和 C++ 编写的。
最佳答案
如果您的应用程序遇到硬崩溃,那么不,您精心设计的清理代码将不会运行,无论它是 RAII 范例的一部分还是您在 main
末尾调用的方法。在导致应用程序终止的崩溃之后,应用程序的清理代码都不会运行。
当然,对于异常情况并非如此。尽管这些最终可能导致应用程序终止,但它们仍然以受控方式触发此终止。通常,运行时库会捕获未处理的异常并触发终止。在此过程中,将执行基于 RAII 的清理代码,除非它也抛出异常。然后你又回到了被毫不客气地从内存中剔除的状态。
但即使您的应用程序清理代码无法运行,操作系统仍会尝试在您之后进行清理。这解决了未释放的内存、句柄和其他系统对象的问题。一般来说,如果你崩溃了,你不用担心释放这些东西。您的应用程序的状态是不一致的,因此尝试执行一堆清理代码只会导致不可预测和潜在的错误行为,更不用说浪费大量时间了。只是崩溃,让系统处理你的烂摊子。 As Raymond Chen puts it :
The building is being demolished. Don't bother sweeping the floor and emptying the trash cans and erasing the whiteboards. And don't line up at the exit to the building so everybody can move their in/out magnet to out. All you're doing is making the demolition team wait for you to finish these pointless housecleaning tasks.
做你必须做的;跳过其他一切。
这种方法的唯一问题是,正如您在这个问题中所建议的那样,当您管理不受操作系统控制的资源时,例如另一个系统上的远程资源。在那种情况下,您几乎无能为力。 最佳 方案是让您的应用程序尽可能健壮,以免崩溃,但即使那样也不是完美的解决方案。考虑一下断电时会发生什么,例如因为用户的猫从墙上拉了电源线。那时不可能运行任何清理代码,因此即使您的应用程序永远不会崩溃,也可能会出现您无法控制的终止事件。因此,您的外部资源必须在发生故障时是可靠的。超时是一种标准方法,也是比轮询更好的解决方案。
根据特定用例,另一种可能的解决方案是在应用程序初始化时运行一致性检查和清理代码。这可能是您为旨在连续运行并在终止后立即重新启动的服务所做的事情。下次重新启动时,它会检查其数据和/或外部资源的一致性,根据需要释放和/或重新初始化它们,然后照常继续。显然,这对于典型的应用程序来说是一个糟糕的解决方案,因为无法保证用户会及时重新启动它。
关于c++ - 程序崩溃时如何释放资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40937292/
我试图找到在庞大的代码库中创建 NaN 的位置。是否有一些编译器标志或我可以用来在 NaN 上 panic 的东西,这样我就可以找到它在哪一行? 最佳答案 没有编译器标志。你能做的最好的事情就是把你的
A类 class ClassA { @Autowired class ClassB; } 类配置: @Configuration class TestConfi
我是一名统计学研究生,经常使用 R。我熟悉其他编程环境中的 OOP。我什至在各种定义用于存储数据的新类的统计包中看到了它的使用。 在我研究生生涯的这个阶段,我通常会为一些类作业编写一些算法——一些接收
我想要两个不同的网络摄像头视频输出,一个是普通的网络摄像头镜头,另一个是它的“镜像”版本。 cv2可以吗? import time, cv2 video=cv2.VideoCapture(0) a=0
我创建了一个可以通过两种方式过滤的图库。一个通过单击按钮,另一个通过搜索过滤器。过滤器工作完美,除了当 div 隐藏在过滤器上时,其余显示的 div 不会彼此相邻 float 。 这是过滤前的样子:
我们作为一个 4 人团队工作,我们的项目部署在 openshift我们使用 git 存储库 进行提交、推送和 pull 。当有人提交更多更改时,其他人必须 pull 它以在我们的系统中进行更新。但是从
我正在尝试扩展自动完成功能,以便在选择某个项目时显示辅助标签。例如,给定显示项目的自动完成功能,项目名称将显示在包含代码的输入框旁边的 span 标记中。 查看自动完成源代码,我发现过滤值的下拉列表是
我有一个包含歌曲、艺术家和专辑实体的核心数据。 歌曲有可选的一对一关系艺术家到艺术家实体和专辑到专辑实体这两个实体都与 Song 实体具有反向关系。 相册有可选的一对一关系艺术家到艺术家实体和可选的一
XmlSerializer正在调用 IList.Add()在我的课上,我不明白为什么。 我有一个自定义类(层次结构中的几个类之一),其中包含我使用 XmlSerializer 与 XML 相互转换的数
我们在 Web 应用程序中定义了此事件,它创建了一个名为 timelineEventClicked 的自定义触发器 canvas.addEventListener('click', function
有大量资源可用于使用 Swift(可达性)检查有效的 Internet 连接,以及在进行 API 调用时检查 httpResponse 的 statusCode 的方法,但是检查和处理这些的“正确”方
谁能告诉我是否可以在 Controller 规范中 stub params[] 值,以便 Controller 接受 stub 值作为 View 中的实际 params[] 值。 例如,我的观点有一个
我的问题是没有在 UserControl 中连接 DependencyProperties。这不是问题。当我将 UserControl 中的按钮绑定(bind)到 UserControl 的 Depe
如何#define 路径 L"C:\Windows\System32\taskmgr.exe"来处理宽字符 #define TASK_MGR "C:\\Windows\\System32\\taskm
我正在尝试使用 Jasmine 和 Sion 编写单元测试,但是在使用 RequireJs 加载模块时我很难找到以下等效项: sinon.stub(window, "MyItemView"); 使用
我有一个包含三个 div 的示例页面,如下所示: 当浏览器大小达到 md 点并且第二个 div 高于第一个 div 时,第三个 div 开始在第一个的右侧
我在 C++ 端有 CString cs,在 C# 端有 IntPtr ip,它通过编码(marshal)处理机制包含 cs 的值。 然后,我只需将需要的字符串作为 Marshal.PtrToStri
我是一名优秀的程序员,十分优秀!