[英]Is there anyway to dynamically free thread-local storage in the Win32 APIs?
我需要在跨平台項目中使用線程本地存儲。 在* IX下我使用pthreads並且可以避免內存泄漏,這要歸功於作為pthread_key_create
的第二個參數傳遞的漂亮的析構函數指針,但在Windows中TlsAlloc
沒有這樣的東西。 我也找不到在線程退出時調用任何函數的一般位置(否則我會自動添加一些在退出時調用的函數指針列表)。
現在看起來我基本上有一種情況,為了實際使用線程本地存儲我需要在堆上分配我自己的空間並傳遞指向TlsSetValue
,但如果線程退出...我無法確保釋放內存(除了在線程函數結束時顯式調用TlsGetValue
和delete
/ free
/ HeapFree
/ etc的人。
有誰知道更好的方法?
即使線程被終止,你也可以找到一個很好的“終結器”來擺脫特定於線程的資源:使用RegisterWaitForSingleObject
等待線程句柄的副本 (通過DuplicateHandle
) - 你必須使用克隆的句柄,因為注冊等待無法處理句柄{沒有雙關語意圖}關閉。
使用堆分配的結構/記錄來保存最終的資源,句柄等待和等待句柄本身,導致終結器將在系統線程池中運行,而不是最終的線程 (它將在時間已經死亡)。 並且不要忘記敲定終結者:)
在線程出口上調用DLL( DLLmain
)的入口點,原因碼為DLL_THREAD_DETACH
。 編寫一個DLL來跟蹤在線程退出時調用的函數是相當簡單的。
或者,使用Boost.Thread和boost::this_thread::at_thread_exit
函數來注冊要在線程退出時調用的函數,或者使用boost::thread_specific_ptr
來完全包裝TLS用法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.