如何获取Win32线程的名称?

Mic*_*ley 14 c++ windows winapi multithreading unmanaged

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

Ana*_*tts 17

线程实际上在Win32中没有名称.进程via RaiseException只是VS Debugger的"秘密握手",它实际上存储了TID => Name映射.Windows本身没有线程"名称"的概念.


Chr*_*ris 12

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

如果设置了线程名称,那么IDE的调试器将为您存储它,这使得调试更容易.但是,该名称永远不会通过Windows API调用真正附加到该线程.

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

即使它是可访问的 - 我也不会编写仅适用于附加调试器的代码.更好地将名称与手柄一起存储起来.


Mic*_*ley 12

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

这是一个例子:

HRESULT hr = GetThreadDescription(ThreadHandle, &data);
if (SUCCEEDED(hr))
{   
    wprintf(“%ls\m”, data);
    LocalFree(data);
}
Run Code Online (Sandbox Code Playgroud)

这是文档:

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