如何获取Win32线程的名称?

时间:2012-02-20 18:51:44

标签: c++ windows multithreading winapi unmanaged

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

3 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:12)

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

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

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

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

答案 2 :(得分:10)

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

以下是一个例子:

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

这是文档:

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