Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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
C++ 安全分段故障?_C++_C_Multithreading_Segmentation Fault - Fatal编程技术网

C++ 安全分段故障?

C++ 安全分段故障?,c++,c,multithreading,segmentation-fault,C++,C,Multithreading,Segmentation Fault,在我的简单游戏中,有一条线在屏幕上画图。我让我的程序在按下ESC键时抛出一个退出信号作为例外。每当捕获到此异常时,将调用清除函数并退出程序。当在屏幕绘制未完成的情况下调用清理功能时,会出现此“预期”分段错误,导致绘制线程有点孤立。我的Ubuntu Linux操作系统似乎可以安全地处理这个问题,并且不会崩溃,尽管它告诉我一个分段错误。你认为这样可以吗?如果没有,我可能会面临什么样的严重问题?我只是对在这种情况下系统内部发生的事情有点感兴趣。分段错误可能意味着您试图访问内核设置的进程保留区之外的内存

在我的简单游戏中,有一条线在屏幕上画图。我让我的程序在按下ESC键时抛出一个退出信号作为例外。每当捕获到此异常时,将调用清除函数并退出程序。当在屏幕绘制未完成的情况下调用清理功能时,会出现此“预期”分段错误,导致绘制线程有点孤立。我的Ubuntu Linux操作系统似乎可以安全地处理这个问题,并且不会崩溃,尽管它告诉我一个分段错误。你认为这样可以吗?如果没有,我可能会面临什么样的严重问题?我只是对在这种情况下系统内部发生的事情有点感兴趣。

分段错误可能意味着您试图访问内核设置的进程保留区之外的内存


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

据我所知,主线程正在释放绘图线程使用的内存,而无需任何形式的同步,即。,当主线程被绘图线程写入时,它可以释放内存

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


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

这听起来不是一个好的设计,事实上听起来与反模式非常相似。最好让线程将事件发布回主线程,并执行“连接”以控制关闭。

当您想退出程序时,您可以隐藏gui并尝试标记所有正在运行的线程以停止。在程序的调用退出之前,请检查循环,直到所有线程都停止并出现迭代超时。为了避免cpu过载,请在此循环上设置睡眠

Heh?您所说的
安全处理并不会崩溃是什么意思,尽管它告诉我一个分段错误
?另外,您可能想了解一下。最近还有一个关于恢复SIGSEGV的问题,这是不可能的。@iharob很可能,您对我的第一个评论有什么回答吗?我仍然感到困惑。@SouravGhosh我所说的“不崩溃”是指至少系统仍能响应我的请求。循环睡眠并不是最好的同步方式,因为你有更好的机制。不是用于sincronization,而是如果你只检查线程是否完成了它们的工作,您可以在低优先级线程中使用循环,因此可以在此处添加睡眠。正如问题所说,问题不是sicronization,而是关闭应用程序的方式。为了关闭多线程应用程序,您需要确保所有线程都已完成工作,这就是我对flagsWell的建议,等待不同线程/进程中发生某种事件通常是一个同步问题。积极等待(即使有睡眠)不是最好的主意。