SetThreadName & GetThreadName

本文深入探讨了在不同操作系统中实现线程命名的方法,包括Windows下通过异常处理机制设置线程名,以及在Apple和Android平台上使用特定API进行线程命名的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ypedef 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)
  {
  }
}

char* GetThreadName(void)
{
    char* pszName=NULL;
    __asm{
        mov eax, fs:[0x18]    //    Locate the caller's TIB
        mov eax, [eax+0x14]    //    Read the pvArbitary field in the TIB
        mov [pszName], eax    //    pszName = pTIB->pvArbitary
    }
    return pszName ? pszName : "Win32 Thread";
}

 

#elif UNITY_APPLE
    // pthread_setname_np is OSX 10.6 and later only
    int (*dynamic_pthread_setname_np)(const char*);
    *reinterpret_cast<void**>(&dynamic_pthread_setname_np) = dlsym(RTLD_DEFAULT, "pthread_setname_np");
    if (dynamic_pthread_setname_np)
        dynamic_pthread_setname_np(name);
#elif PLATFORM_ANDROID || PLATFORM_TIZEN
    prctl(PR_SET_NAME, (unsigned long)(name ? name : "<Unknown>"), 0, 0, 0);
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值