安全分段错误?

A Safe Segmentation Fault?

在我的简单游戏中,有一个线程在屏幕上绘图。当我按下 ESC 键时,我让我的程序抛出一个退出信号作为异常。每当捕获到此异常时,都会调用清理函数并退出程序。这个 'expected' 分段错误是在屏幕绘图未完成时调用清理函数时发生的,因此绘图线程有些孤立。我的 Ubuntu Linux OS 似乎可以安全地处理这个问题并且不会崩溃,尽管它告诉我一个分段错误。你觉得就这样放着好吗?如果不是,我可能会面临什么样的严重问题?我只是对这种情况下系统内部发生的事情有点兴趣。

该分段错误可能意味着您正在尝试访问内核设置的进程保留之外的内存。

您应该尝试修复导致分段错误的问题,一个对内存分析非常有用的工具是 Valgrind 您可以从 ubuntu 存储库安装它。

据我了解,主线程正在释放绘图线程使用的内存,没有任何形式的同步,即主线程可能会在绘图线程正在写入时释放该内存。

这不安全,您绝对不应该那样离开。主线程上的退出处理程序应该停止绘图线程,或者等待它完成,然后才释放内存。

正如您所描述的,您的代码具有未定义的行为。请注意,按预期工作是未定义行为的一种有效形式——但这并不意味着它将始终按预期工作。任何事情都有可能发生。

这听起来不像是一个好的设计,实际上听起来与 Coding by exception 反模式非常相似。最好让线程 post 事件回到主线程,并执行 'join' 以控制关闭。

当你想退出程序时,你可以隐藏gui并尝试标记所有运行停止的线程。在程序调用退出之前,检查一个循环,直到所有线程都因迭代超时而停止。为避免超载 cpu 在此循环上休眠