在我的简单游戏中,有一个线程可以将绘图绘制到屏幕上。当我按下ESC键时,我让我的程序抛出一个退出信号作为异常。只要捕获到此异常,就会调用清理函数并退出程序。当在没有完成到屏幕的绘图时调用清理功能时发生这种“预期的”分段故障,结果绘制线程有些孤立。我的Ubuntu Linux操作系统似乎可以安全地处理这个问题并且不会崩溃,尽管它告诉我一个分段错误。你觉得这样离开会好吗?如果没有,我可能面临什么样的严重问题?在这种情况下,我对系统内部发生的事情只有一点兴趣。
答案 0 :(得分:4)
据我所知,主线程释放了绘图线程使用的内存而没有任何形式的同步,即主线程在绘制线程写入时可以释放该内存。
这不安全,你绝对不应该这样离开。主线程上的退出处理程序应该停止绘制线程,或者等待它完成,然后才释放内存。
正如您所描述的那样,您的代码具有未定义的行为。请注意,按预期工作是一种有效的未定义行为形式 - 但它并不意味着它将始终按预期工作。任何事情都可能发生。
答案 1 :(得分:3)
该分段错误可能意味着您正在尝试访问内核设置的进程储备之外的内存。
您应该尝试修复导致分段错误的问题,对于内存分析非常有用的工具是Valgrind,您可以从ubuntu存储库安装它。
答案 2 :(得分:1)
这听起来不是一个好的设计,实际上听起来与Coding by exception反模式非常相似。最好让线程将事件发回主踏板,并执行“加入”操作。控制关闭。
答案 3 :(得分:0)
当你想要退出程序时,你可以隐藏gui并尝试标记所有正在运行的线程以停止。在程序上调用exit之前检查一个循环,直到所有线程都被迭代超时停止。为避免cpu过载,请在此循环中进行睡眠