c++ - 程序终止后 C++ const static 的行为

标签 c++ static exit

我有一个程序在启动时创建一个线程(我正在使用 C++ Boost 库创建线程)。在主程序中,我已将清理功能注册为。

atexit(cleanExit)
// Trap some signals for a clean exit.
signal(SIGQUIT, signalled)
signal(SIGABRT, signalled)
signal(SIGTERM, signalled)
signal(SIGINT, signalled)

static void signalled(int signal)
{
    exit(signal)
}
static void cleanExit(void)
{
     thread->interrupt();
     thread->join();
}

正如您在上面看到的那样,在干净退出过程中,我中断了线程,然后在这里(在主进程中)等待,以便线程执行其清理工作。当我调用 thread->interrupt 时,我的线程被中断,我执行线程清理工作。到这里为止一切正常,没有问题。

但是当我在线程中调用清理函数时,问题就来了。在清理函数中,我将一些状态发送回服务器,为此我创建了一个实用函数,在这个实用函数中,我正在访问类的“const static string”成员。问题是当我访问这个常量静态字符串时,我的应用程序卡住了。我已经用 strace 检查过,我遇到了段错误。但是,当我将这个“const static string”更改为“const string”时,我的清理工作变得很顺利。

问题 一旦程序终止,C++“const static”的行为是什么。他们是否在调用退出时放弃(在上面的案例中可以看到)或对此行为的任何想法。


更新#1

这里是线程处理函数。正如我在上面提到的,它是一个 Boost 线程。

try {
    while ( true ) {
        // Do your job here.
        // 1: We can be interrupted.
        boost::this_thread::interruption_point();
    }
}
catch (boost::thread_interrupted const& )
{
    // Before exiting we need to process all request messages in the queue
    completeAllWorkBeforeExiting();
}

当主程序调用 thread->interrupt 时,线程将在 #1 处引发 thread_interrupted 异常,并捕获此异常我正在做我的清理工作。

最佳答案

const 不影响任何对象何时被销毁。

static 对象的销毁顺序与其创建顺序相反。 atexit 本质上是创建一个匿名的 static 对象,并将给定的函数作为其析构函数。也就是说,static 对象析构函数和 atexit 回调的发生顺序与它们的构造/注册相反。

从信号处理程序调用 exit 是完全不安全的。实际上允许信号处理程序做的就是设置一个标志,稍后由线程轮询。正如您所提到的,信号处理程序在中断时运行,因此它可能会中断系统调用。它可能会以绕过 malloc 的多线程锁的方式中断 malloc,因为重入是在同一个线程上,而不是通常发生的不同线程。

所以这是各种不可预测行为的根源。没有看到更多,我不能更具体地说明 static 有什么影响,但它可能与更改对象的生命周期和/或每个对象实例化一次有关。

关于c++ - 程序终止后 C++ const static 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14230681/

相关文章:

c++ - 如果包含 map 的静态库与可执行和动态库链接,静态 map (变量)会被多次释放吗?

windows - 为什么我在尝试构建 QT 的静态版本时遇到 NMAKE 错误?

multithreading - 使用阻塞调用时如何退出程序

java - java中如何终止正在运行的循环?

c++ - 从文件夹加载文件并保存到另一个文件夹

c++ - STL 排序 - 严格弱排序

java - 为什么实例和静态内部类的初始化不同?

PHP:如何销毁/取消设置应用程序中的所有类

c++ - 警告 : ‘<anonymous>’ is used uninitialized in this function [-Wuninitialized]

.net - 如何将 C++ 字符串转换为 .NET 字符串^?