Windows下C++设置线程名字方便多线程调试

C++多线程编程,调试是一个大问题,原因之一就是,线程名字继承了父进程的名字,因此导致同一段代码的不同线程名字一样;而且还会导致线程的名字怪怪的,不好看。
因此,如果在代码中可以设置线程的名字就好了,这样在调试中就可以看到期望的线程名字,这样便于调试。

Windows

在Visual Studio调试的线程选项卡看到设置名字后的线程的名字:
![](https://img-blog.csdnimg.cn/img_convert/b72c93520d2b8a1329270d49858815f6.png#clientId=u6661c13b-a839-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u36d35afa&margin=[object Object]&originHeight=240&originWidth=900&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=ud1de197c-8ef0-4b58-9002-55e0693789f&title=)
可以看到,我把其中一条线程的名字改成了FlushHip-TEST-THREAD,要是没有设置,会是怎么样的呢,看下图:
![](https://img-blog.csdnimg.cn/img_convert/0bd46f5b2837eca41cc64a1467ad34ef.png#clientId=u6661c13b-a839-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=uab0bb7c5&margin=[object Object]&originHeight=240&originWidth=900&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u89daa1b8-e1e3-44c7-8931-3a116ecfddd&title=)
看到了吧,这样的名字只有老天知道是哪条线程。
那么在Windows中如何用代码来设置线程名字呢?

#include <windows.h>

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;

void SetThreadName(DWORD dwThreadID, LPCSTR szThreadName)
{
    THREADNAME_INFO info;
    info.dwType = 0x1000;
    info.szName = szThreadName;
    info.dwThreadID = dwThreadID;
    info.dwFlags = 0;

    __try
    {
        RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD), (DWORD*)&info );
    }
    __except(EXCEPTION_CONTINUE_EXECUTION)
    {
    }
}


利用结构化异常SHE和RaiseException还有异常代码0x406D1388,可以实现设置线程名字。
:::info
The native method of setting the thread name is implemented by raising an SEH exception that is continued. If you go to the docs on RaiseException you’ll see part of the reason for this strange mechanism. An attached native debugger will get a ‘first chance’ notification of the exception. Raising an exception is precisely what you need to do to get the native debugger’s attention. The one raised here (0x406D1388) is recognized by VS (and WinDbg).
:::
SHE是编译期相关的,这样子设置线程名字的方式只能用于VS。
如何使用这个函数呢?首先,在本线程中设置名字只需要把dwThreadID设置成-1就行了,设置别的线程的名字可以指定别的线程的ID。

std::thread th([]()
{
    SetThreadName(-1, "FlushHip-TEST-THREAD");
    std::this_thread::sleep_for(std::chrono::seconds(1000));
});

参考资料:
How to: Set a Thread Name in Native Code
Linux/Windows下C++设置线程名字方便多线程调试



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值