我想在調用所有C++ thread_local析構函數之後做一些工作。 這是平臺特定的 - Android,所以我有權訪問pthreads
。C++ thread_local析構函數與pthread析構函數
問題是,當應該調用dd析構函數時,在C++ thread_local
析構函數之前或之後?或者他們可以交錯?
我測試了在C++之後調用的Linux Mint和pthread析構函數。
我想在調用所有C++ thread_local析構函數之後做一些工作。 這是平臺特定的 - Android,所以我有權訪問pthreads
。C++ thread_local析構函數與pthread析構函數
問題是,當應該調用dd析構函數時,在C++ thread_local
析構函數之前或之後?或者他們可以交錯?
我測試了在C++之後調用的Linux Mint和pthread析構函數。
bionic/pthread_exit.cpp當前具有相同的順序:
void pthread_exit(void* return_value) {
// Call dtors for thread_local objects first.
__cxa_thread_finalize();
// Call the TLS destructors.
pthread_key_clean_all();
然而,該未記錄的行爲你不應該建立依賴它的東西。
libstdc++
來自海灣合作委員會使用pthread_key_create
萬一平臺不提供__cxa_thread_atexit_impl
。在這種情況下,C++析構函數在POSIX析構函數的中間運行。
據我所知,沒有標準要求任何特定的行爲,因爲C++不知道POSIX,而POSIX不知道C++,所以兩種標準都沒有說明這裏會發生什麼。在線程銷燬期間還有一些涉及線程本地數據復活的情況,這些數據在實現中會有所不同。 (一個典型的例子是用於從線程局部變量的析構函數來登錄每線程記錄器對象。)
我懷疑你會發現thread_local是通過pthread_key_create實現的。 –
@RichardHodges我也期待這樣,起初......但! pthread_key_create銷燬順序未定義,C++ thread_local析構函數需要按順序排列。他們不能只是純粹的線程。所以,他們可能不能被交錯...因此 - 他們都被調用或之前,或之後...... – tower120
其實,在godbolt上玩耍似乎gcc實際上使用寄存器來跟蹤thread_specific數據。 –