发生这种情况是因为_beginthreadex()
调用CreateThread()
了它自己的线程函数,该函数调用了您指定的那个(因此调试器使用_threadstartex
函数名称 -_beginthreadex()
调用的那个)。
您可以使用SetThreadName()
MSDN 中的示例自己手动设置线程名称。您可能想要做的是创建自己的包装器,_beginthreadex()
它可能看起来像:
uintptr_t startthreadex(
void* security,
unsigned stacksize,
unsigned (__stdcall * threadproc) (void *),
void* args,
unsigned flags,
unsigned * pThread_id,
char* thread_name)
{
unsigned alt_thread_id;
if (!pThread_id) {
pThread_id = & alt_thread_id;
}
uintptr_t result = _beginthreadex(security, stacksize, threadproc, args, flgas, pThread_id);
if (result == 0) return result;
SetThreadName( *pThread_id, thread_name);
}
现在您可以调用startthreadex()
而不是_beginthreadex()
传递线程名称。这样做的一个小优点是,如果您使用相同的函数来运行多个线程,您可以轻松地为它们赋予每个唯一的名称,以反映传递给线程或其他任何参数的参数。
如果您希望线程名称自动将线程 proc 函数名称作为调试器的线程名称,您可以制作一个将函数名称参数字符串化的包装宏(所需要的只是另一个级别的间接或解决任何问题.. .)。
这是SetThreadName()
(来自http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx):
//
// Usage: SetThreadName (-1, "MainThread");
//
#include <windows.h>
const DWORD MS_VC_EXCEPTION=0x406D1388;
#pragma pack(push,8)
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;
#pragma pack(pop)
void SetThreadName( DWORD dwThreadID, char* threadName)
{
THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = threadName;
info.dwThreadID = dwThreadID;
info.dwFlags = 0;
__try
{
RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info );
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
}