如何获取Win32线程的名称

How to get the name of a Win32 Thread?

本文关键字:线程 Win32 何获取 获取      更新时间:2023-10-16

我知道在Windows下设置线程名称的非直观过程(请参阅"如何将名称设置为Win32线程?")。有没有办法得到线程的名称?我看不到任何允许我执行此操作的Windows API(http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847(v=vs.85).aspx).

线程在Win32中实际上没有名称。通过RaiseException的过程只是与VS调试器的"秘密握手",后者实际上存储TID=>Name映射。Windows本身没有线程"名称"的概念。

从Windows 10版本1607开始,您现在可以使用GetThreadDescription()获取线程的名称,假设SetThreadDescription()用于设置线程的名称。

这里有一个例子:

HRESULT hr = GetThreadDescription(ThreadHandle, &data);
if (SUCCEEDED(hr))
{   
    wprintf(“%lsm”, data);
    LocalFree(data);
}

这是文档:

https://msdn.microsoft.com/en-us/library/windows/desktop/mt774972(v=vs.85).aspx

没有这样的WinAPI调用,因为不存在线程名称。

如果您设置了一个线程名称,那么IDE的调试器将为您存储它,这将使调试更加容易。然而,该名称从未通过windows API调用真正附加到线程。

如果在没有调试器的情况下运行应用程序,那么设置线程名称将无效,因此无法检索名称。

即使它是可访问的,我也不会编写只与调试器连接的代码。最好将名称与句柄一起保存。