2012-09-22 74 views
2

我對使用atexit在多線程應用程序中存在疑問。不同線程中的多個atexit處理程序

假設我有以下情形

Thread A calls atexit(handler_a) 
Thread B calls atexit(handler_b) 
main() calls atexit(handler_main) 
Thread C calls atexit(handler_c) 
.... 

都處理函數在一個獨特的線程執行,或者是他們在單獨的線程中執行?

如果他們在單個線程(一個接一個地執行)中執行,該線程將成爲主線程嗎?

我正在使用Linux和g ++。

回答

5

正如rici所說,atexit處理程序是從調用退出的線程調用的。如果你想要每個線程處理程序,你可以使用pthread_key_create析構函數。

0

我沒有看到任何約束條件,需要從一個線程調用atexit處理程序。實際上,我認爲同時註冊的處理程序(如同時在其他註冊中排序)也可以同時執行。然而,該標準確保註冊在另一個之前排序的處理程序將在後者之後執行。

+1

很難想象在調用exit()的線程中,不僅僅調用atexit處理程序的exit()的實現。確實,該標準沒有定義atexit處理程序的順序,對atexit的調用沒有同步,但標準確實需要atexit是線程安全的,所以看起來必須有一些調用順序。無論如何,很難看到實現如何知道兩個來自不同線程的調用是否被故意同步。 – rici