繁体   English   中英

在调用exit之后访问其他线程中的全局变量是否安全?

[英]Is it safe to access global variables in other thread after exit called?

我正在分析一个转储,其中一个显示退出已被调用

#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

同时,在尝试访问全局变量时,转储在另一个线程中。 那么在调用exit之后在另一个线程中访问全局变量是否安全? 退出退出后,全局变量会“随时”销毁吗?

那么在调用exit之后在另一个线程中访问全局变量是否安全?

是的,在任何非平凡的操作系统上。 调用exit之后,甚至可以安全地访问其他线程中的本地/自动存储var。 Windows / linux等设计人员确实在设计时就想到了这个问题,因此开发了他们的进程终止序列,以便在释放任何内存之前先停止进程中的所有线程。 未处于运行状态的进程线程的状态已更改,因此它们将永远无法再次运行。 在与称为“退出”的线程不同的内核上运行的进程线程,通过对运行它们的内核的硬件中断来强制删除其执行。 只有当所有线程都停止时,才释放和释放资源(如内存),以供其他进程重新使用。

退出退出后,全局变量会“随时”销毁吗?

是。 调用退出后,操作系统将在某个时候释放托管全局内存的内存段。 但这无关紧要,因为任何时候只要有进程线程都不会运行。

请注意,所有exit()调用的创建方式均相同:)有些调用程序将在调用OS终止进程之前运行静态dtor等,这确实可能导致调用它们的线程可能仍在运行,从而可能导致UB / segfaults 。 对于具有非平凡dtor的非POD类,这种情况更有可能出现。

如果发现这是一个实际问题,请使用不运行静态dtor的退出调用(这可能会也可能不会很重要,这取决于dtor的工作或需要执行的操作),或者避免该问题通过不使用静态全局变量(无论如何都不是一个坏计划),或者作为最后的选择,在调用exit()之前尝试在用户空间中共同终止有问题的线程,这是一个痛苦的过程,通常是可以避免的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM