POSIX標準這似乎
並沒有被Posix的定義atexit
處理器是否被稱爲線程被終止exit
之前或之後。
有兩個(或三個)方式的進程終止「正常」。
所有線程都終止。當最後一個線程退出時,無論是通過返回還是呼叫pthread_exit
,都會運行atexit
處理程序。在這種情況下,沒有其他線程。 (這取決於平臺,如果主線程終止而不是exit
,其他平臺可能終止其他線程,其他平臺則不會)。
一個線程調用exit
。在這種情況下,將會運行atexit
處理程序並終止所有線程。 Posix沒有按照什麼順序指定。
main
回報。這或多或少地相當於調用exit()
作爲main
的最後一行,因此可以如上處理。
OS實踐
在Linux中,文件https://linux.die.net/man/2/exit 說線程由_exit
調用exit_group
終止,並_exit
之後atexit
處理程序調用。因此,在調用exit
的Linux中,任何atexit
處理程序都在線程終止之前運行。請注意,它們在調用exit
的線程上運行,而不是調用atexit
的線程。
在Windows上,如果你在意的話,行爲是一樣的。
模式進行緊急清理。
最好的模式是:永遠不要處於需要緊急清理的狀態。
- 沒有保證您的清理將運行因爲 你可以有一個
kill -9
或 停電。
- 因此,您需要能夠在該方案中恢復。
- 如果您可以從中恢復,您還可以從
abort
中恢復,因此您可以使用abort
作爲您的緊急出口。
如果你不能做到這一點,或者如果你有「最好有」的你想要做清理,atexit
處理要細提供你先緩慢停止所有線程的過程中,以防止在進行清理時進入不一致的狀態。
來源
2016-10-05 10:42:57
Ben
我認爲這個用例應該注意POSIX/ISO委員會的討論。也就是說,我同意你永遠不希望進入一個你需要清理的狀態,但是我已經在一個或兩個地方找到了自己 - 最近如果我的TAP符合單元/迴歸測試代碼引發異常,然後我得到不是消息輸出,或者我必須處理atexit。在多線程的情況下沒有嚴格的atexit定義可能會有問題。 – EBo