我正在分析一个转储,其中一个堆栈显示退出已被称为
#0 0x00007fe2beac80a4 in __lll_lock_wait () from /lib64/libpthread.so.0
#1 0x00007fe2beac3444 in _L_lock_1087 () from /lib64/libpthread.so.0
#2 0x00007fe2beac32b6 in pthread_mutex_lock () from /lib64/libpthread.so.0
#3 0x00007fe2bece5325 in _dl_fini () from /lib64/ld-linux-x86-64.so.2
#4 0x00007fe2bd73a5e5 in __run_exit_handlers () from /lib64/libc.so.6
#5 0x00007fe2bd73a635 in exit () from /lib64/libc.so.6
同时,当尝试访问全局变量时,dump在另一个线程中。那么在调用exit之后访问另一个线程中的全局变量是否安全?退出调用后,“任何时候”全局变量是否会被销毁?
答案 0 :(得分:1)
在退出后访问另一个线程中的全局变量是否安全 被称为?
在任何非平凡的操作系统上,是的。在调用exit之后访问其他线程中的本地/自动存储变量甚至是安全的。 Windows / linux等设计人员确实在设计时考虑了这个问题,因此开发了他们的进程终止序列,以便在释放任何内存之前停止进程中的所有线程。未处于运行状态的进程线程的状态已更改,因此永远不会再次运行。进程线程运行在与调用' exit'的线程不同的核心上运行通过对运行它们的核心的硬件中断强制删除它们的执行。只有当所有线程都停止时,才会释放内存并释放内存以供其他进程重用的资源。
全局变量是否会被销毁"任何时候"退出后叫吗?
是。托管全局的内存段将在调用exit后的某个时间由OS发布。但是,这并不重要,因为在任何时候都不会运行任何进程线程。
请注意,所有exit()
调用都是相同的:)有些人会在调用操作系统终止进程之前运行静态dtors等,这确实会导致调用可能仍在运行的线程出现问题,从而产生问题。可能的UB / segfaults。对于具有非平凡dtors的非POD类,这变得更有可能。
如果发现这是一个实际问题,请使用不运行静态dtors的退出调用(这可能,也可能不重要,具体取决于dtor执行或需要执行的操作),或者通过不使用静态全局变量来避免这个问题(不管怎么说都不是坏计划),或者作为最后的手段,在调用{{1}之前,通过尝试协同终止用户空间中的违规线程的悲惨的,通常可以避免的做法。 }}。