Posix 标准
Posix 似乎没有定义atexit
处理程序是在线程终止之前还是之后调用的exit
。
进程“正常”终止有两种(或三种)方式。
所有线程终止。当最后一个线程通过返回或调用退出时,pthread_exit
将atexit
运行处理程序。在这种情况下,没有其他线程。(这取决于平台。如果主线程不是 by 终止,则某些平台可能会终止其他线程,而exit
其他平台则不会)。
一个线程调用exit
. 在这种情况下,atexit
将运行处理程序并终止所有线程。Posix 没有指定顺序。
main
返回。这或多或少相当于调用exit()
的最后一行main
,因此可以按上述处理。
操作系统实践
在 Linux 中,文档https://linux.die.net/man/2/exit
说线程通过_exit
调用终止exit_group
,并且_exit
在atexit
处理程序之后调用。因此,在 Linux 中,调用exit
任何atexit
处理程序时都会在线程终止之前运行。请注意,它们是在调用的线程上运行的exit
,而不是在调用的线程上运行的atexit
。
如果您关心的话,在 Windows 上的行为是相同的。
紧急清理模式。
最好的模式是:永远不要处于需要紧急清理的状态。
- 无法保证您的清理工作会运行,因为您可能会遇到
kill -9
停电或停电的情况。
- 因此,您需要能够在这种情况下恢复。
- 如果您可以从中恢复,您也可以从 恢复
abort
,因此您可以abort
用于紧急出口。
如果您不能这样做,或者如果您想要进行“非常好的”清理,那么atexit
处理程序应该没问题,前提是您首先优雅地停止进程中的所有线程,以防止在进行清理时进入不一致的状态。