2010-07-13 58 views
3

我需要在跨平臺項目中使用線程本地存儲。在* IX下,我使用pthreads,並且可以避免內存泄漏,這要歸功於作爲pthread_key_create的第二個參數傳遞的nice析構函數指針,但是在Windows中,TlsAlloc沒有這種東西。我也不能找到一個在線程退出時調用任何函數的普通地方(否則我會自制一些在退出時調用的函數指針列表)。有沒有辦法在Win32 API中動態釋放線程本地存儲?

現在看來,我基本上有一種情況,爲了實際使用線程本地存儲,我需要在堆上分配自己的空間並將指針傳遞給TlsSetValue,但是如果線程退出... I有沒有保證的存儲方式被釋放(比別人其他顯式調用TlsGetValue並在線程函數結束的/ etc delete/free/HeapFree

有誰知道一個更好的辦法?

+1

你的線程是如何退出的?正常的方法是在threadproc返回之前清理。 – 2010-07-13 22:14:23

回答

3

入口在線程退出時調用DLL的一個點(DLLmain),原因碼爲DLL_THREAD_DETACH。編寫一個跟蹤函數調用線程退出的DLL是非常簡單的。

或者,使用Boost.Threadboost::this_thread::at_thread_exit函數來註冊對線程退出被調用的功能,或使用boost::thread_specific_ptr完全包住TLS用法。

3

你可以讓自己的好「終結」擺脫線程特定資源,即使線程終止:使用RegisterWaitForSingleObject等待的線程的手柄的副本(通過DuplicateHandle) - 你必須使用克隆的句柄,導致註冊等待不能處理句柄{雙關語意圖}關閉。
使用堆分配結構/記錄來保存最終資源,句柄等待和等待句柄本身,導致終結器將在系統線程池中運行,而不是最終的線程(它已經死了時間)。不要忘了敲定終結者:)

相關問題