共享库卸载和 atexit 处理 - 什么顺序?

Shared library unloading and atexit handling - what order?

我正在调试一个奇怪的问题,它看起来像一个在 atexit 处理程序中被杀死的线程正在访问一个共享库,并且是段错误,因为该共享库在退出处理程序之前被卸载 运行秒。我不确定这是否真的是问题所在,但这是对可能发生的事情的预感。

当进程终止时(主退出或调用 exit()),atexit 处理程序是立即 运行 的下一个吗?我的想法是这样,但我看到的段错误似乎另有说法。

main returning(函数结束或使用 return)和直接调用 exit() 之间有什么区别(关于退出处理)吗?

When a process terminates (main exits or exit() is called), is the atexit handler the immediate next thing to run? My mind says so, but the segfault I'm seeing seems to say otherwise.

不一定,您保证 atexit 个处理程序会 运行。但仅此而已,atexit 处理程序甚至可以与其他事物同时调用。当您对持续时间为 static 的对象使用 remember that may be in the same process. C++ says that atexit may be called concurrently to destructors being run 时。这意味着 atexit 非常危险,您需要确保自己非常小心自己的称呼。

Is there any difference (with regards to exit handling) between main returning (either end of function or with return) and calling exit() directly?

根据文档:没有。

拆房时最安全的做法:什么都不做。就出去吧,让房子被拆掉。可以说,在出去的路上拉上窗帘是不值得的。