1

我最近了解到这::_beginthreadex()总是更可取::CreateThread(),因此我更改了所有使用的调用::CreateThread()

唯一的缺点是我不再在 Visual Studio 的Threads窗口中看到线程函数的名称,因此很难快速识别线程。我假设这是在我使用时由调试器自动完成的::CreateThread(),因为参数完全相同,我只是更改了所用函数的名称。

有什么方法可以继续使用并在Visual Studio 的窗口中::_beginthreadex()查看线程的名称?Threads

4

2 回答 2

3

发生这种情况是因为_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)
   {
   }
}
于 2011-08-18T17:34:57.573 回答
1

_beginthreadex使用over没有特别的优势CreateThread。CRT 函数最终CreateThread只会调用。

你应该阅读:

于 2011-08-18T17:25:02.240 回答