【问题标题】:How to get the name of a Win32 Thread?如何获取 Win32 线程的名称?
【发布时间】:2012-03-11 02:58:10
【问题描述】:

我知道在 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)。

【问题讨论】:

标签: c++ windows multithreading winapi unmanaged


【解决方案1】:

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

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

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

即使它可以访问——我也不会编写只能在附加调试器的情况下工作的代码。最好将自己的名称与句柄一起存储。

【讨论】:

  • 您是说绝对没有办法获得您在调试器中设置的线程名称吗?我想在我的代码中进行一些调试检查,以确保使用线程名称从正确的线程调用它
  • 线程 0x66c 已退出,代码为 0 (0x0) -> 我想,也许 0x66c 类似于名称?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    从 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

    【讨论】:

      猜你喜欢
      • 2010-10-28
      • 2011-05-05
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 2012-01-21
      • 2010-12-29
      相关资源
      最近更新 更多