如何爲Win32線程設置一個名稱。我沒有找到任何Win32 API來實現相同。基本上我想在日誌文件中添加線程名稱。 TLS(線程本地存儲)是唯一的方法嗎?如何將名稱設置爲Win32線程?
回答
您可以隨時將這些信息存儲在合適的數據結構中。使用散列或地圖將GetThreadId()映射到此名稱。由於GetThreadId()始終是一個唯一的標識符,所以這工作得很好。
乾杯!
當然,如果他創造了許多 線程,即HashMap的會慢慢填補 和使用越來越多的內存,所以 一些清理過程可能是一個 好事也。
你是絕對正確的。當一個線程死亡時,它在地圖中的相應條目自然應該被刪除。
當然,如果他創建多個線程,即HashMap的會慢慢填滿,使用越來越多的內存,所以有些清理過程可能是一個很好的事情爲好。 – 2009-05-26 21:27:42
downvoting因爲我太需要一個回答這個問題,但我真的需要一個名稱設置爲線程剖析原因。你的回答沒有回答問題:P – 2015-07-09 23:31:40
這有幫助嗎? How to: Set a Thread Name in Native Code
在託管代碼中,它與設置相應Thread對象的Name屬性一樣簡單。
如果你想看到在調試器(WinDbg的或Visual Studio)的線程的名字: http://blogs.msdn.com/stevejs/archive/2005/12/19/505815.aspx
我實際上並不知道是否有獲得線程名反向方法。但TLS聽起來像是要走的路。
http://msdn.microsoft.com/en-us/library/xcb2z8hs(VS.90).aspx
//
// Usage: SetThreadName (-1, "MainThread");
//
#include <windows.h>
const DWORD MS_VC_EXCEPTION=0x406D1388;
#pragma pack(push,8)
typedef struct tagTHREADNAME_INFO
{
DWORD dwType; // Must be 0x1000.
LPCSTR szName; // Pointer to name (in user addr space).
DWORD dwThreadID; // Thread ID (-1=caller thread).
DWORD dwFlags; // Reserved for future use, must be zero.
} THREADNAME_INFO;
#pragma pack(pop)
void SetThreadName(DWORD dwThreadID, char* threadName)
{
THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = threadName;
info.dwThreadID = dwThreadID;
info.dwFlags = 0;
__try
{
RaiseException(MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
}
的Win32線程沒有名稱。有一個Microsoft約定,應用程序會提出包含線程名稱的特殊SEH異常。這些異常可以被調試器攔截並用於指示線程名稱。一些答案涵蓋了這一點。
但是,這一切都由調試器處理。線程本身是無名對象。所以,如果你想把名字和你的線索聯繫起來,你必須開發自己的機制。雖然您可以使用線程本地存儲,只允許您從該線程中執行的代碼獲取名稱。所以線程ID和名稱之間的全局映射似乎是最自然和有用的方法。
另一種方法是在線程的TEB的ArbitraryUserPointer字段中存儲指向名稱的指針。這可以在運行時寫入和讀取。
有一個CodeProject文章標題爲"Debugging With The Thread Information Block",告訴你如何做到這一點。
您可以使用線程本地存儲對象來存儲名稱。例如,
__declspec(thread) char threadName[32];
然後,您可以從一個線程寫入並讀取它。這在記錄器應用程序中很有用,您可以在其中打印出每條消息的線程名稱。您可能想要在線程啓動時立即寫入此變量,並且還會拋出Microsoft異常(https://stackoverflow.com/a/10364541/364818),以便調試器也知道線程名稱。
根據與微軟調試團隊領導討論(詳見下文鏈接)的SetThreadDescription API是將要使用微軟前進,以支持線程在本機代碼正式命名的API。 「正式」是指一個MS支持的用於命名線程的API,而不是當前僅在Visual Studio中運行進程時才起作用的異常拋出黑客。
此API在Windows 10面世開始,版本1607
然而,目前很少有工具支持,所以您設置的名稱將不會在Visual Studio或WinDbg中的調試器可見。但是,到2017年4月,Microsoft xperf/WPA工具確實支持它(通過此API命名的線程將在這些工具中正確顯示其名稱)。
- 1. 如何獲取Win32線程的名稱?
- 2. JAVA:如何設置線程名稱(RMI)?
- 3. 如何給線程設置名稱?
- 4. 如何設置Apache.NMS線程名稱
- 5. 將名稱設置爲SKSpriteNode?
- 6. 如何將列名稱設置爲.csv文件列的名稱?
- 7. 在循環中設置名稱將名稱設置爲數字
- 8. 使用prctl PR_SET_NAME爲進程或線程設置名稱?
- 9. 使用Win32 API設置程序描述和公司名稱
- 10. 如何在MacOSX中設置線程名稱
- 11. 如何設置Quartz.net工作線程名稱?
- 12. 如何在TestNG中設置線程名稱
- 13. log4cplus中的線程名稱是如何設置的?
- 14. Scala:如何設置演員線程名稱
- 15. 如何爲JBOSS設置JNDI名稱
- 16. 如何爲asyncio任務設置名稱?
- 17. 如何設置默認名稱爲GtkComboBox?
- 18. 如何爲TriggerListener設置名稱?
- 19. 如何爲Sequelize應用程序設置應用程序名稱
- 20. 將名稱空間設置爲XElement
- 21. 爲一個線程設置名稱和線程組有什麼好處?
- 22. 如何將矩陣的名稱設置爲另一個矩陣的名稱?
- 23. 我如何知道線程ID爲PDH的線程名稱
- 24. 將HTML更改圖像名稱設置爲目錄名稱
- 25. 將參數名稱設置爲內部表格名稱
- 26. 獲取名稱值並將值設置爲另一個名稱
- 27. 如何將線程名稱轉換爲日誌而不是[p:default-threadpool;女:閒置]
- 28. 如何將列名稱設置爲聲明的變量?
- 29. Ant - 如何將$ {ant.project.name}設置爲項目文件夾名稱?
- 30. 如何將cbutton的標籤名稱設置爲$ data?
的SetThreadDescription()API是:
如果你想看到這個增益更好的支持,如在WinDbg中,Visual Studio中,和崩潰轉儲文件,請使用此鏈接爲它投票,未來,微軟將支持這個API。有關詳細信息,請參閱本答案:http://stackoverflow.com/a/43787005/434413 – 2017-05-04 15:25:09