2017-11-11 140 views
0

我想在調用所有C++ thread_local析構函數之後做一些工作。 這是平臺特定的 - Android,所以我有權訪問pthreadsC++ thread_local析構函數與pthread析構函數

問題是,當應該調用dd析構函數時,在C++ thread_local析構函數之前或之後?或者他們可以交錯?

我測試了在C++之後調用的Linux Mint和pthread析構函數。

+0

我懷疑你會發現thread_local是通過pthread_key_create實現的。 –

+0

@RichardHodges我也期待這樣,起初......但! pthread_key_create銷燬順序未定義,C++ thread_local析構函數需要按順序排列。他們不能只是純粹的線程。所以,他們可能不能被交錯...因此 - 他們都被調用或之前,或之後...... – tower120

+0

其實,在godbolt上玩耍似乎gcc實際上使用寄存器來跟蹤thread_specific數據。 –

回答

1

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(); 

然而,該未記錄的行爲你不應該建立依賴它的東西。

+0

如果我將從pthread析構函數重新註冊pthread析構函數,如下所示:https://stackoverflow.com/a/47237684/1559666?文檔說析構函數的調用順序是未定義的,但它表示它將進行迭代... C++ thread_local析構函數不能重新註冊自身(標準行爲),所以如果我們跳過一次,在第二次迭代時我們保證應該執行在C++之後。對? – tower120

+1

@ tower120不,不保證,如果C++ thread_local不使用pthread析構函數。 – ephemient

+0

嗯...確實... – tower120

0

libstdc++來自海灣合作委員會使用pthread_key_create萬一平臺不提供__cxa_thread_atexit_impl。在這種情況下,C++析構函數在POSIX析構函數的中間運行。

據我所知,沒有標準要求任何特定的行爲,因爲C++不知道POSIX,而POSIX不知道C++,所以兩種標準都沒有說明這裏會發生什麼。在線程銷燬期間還有一些涉及線程本地數據復活的情況,這些數據在實現中會有所不同。 (一個典型的例子是用於從線程局部變量的析構函數來登錄每線程記錄器對象。)