是否可以给boost::thread
命名,以便调试器表格和崩溃日志更易读?如何实现?
thread::native_handle
包含一个数字,我无法将其与系统中的任何内容匹配。另一方面,thread::get_id()
方法以十六进制字符串的形式直接返回Windows线程ID。请注意,返回的值是特定于平台的。下面的代码在Boost 1.50.0 + Win32 + VS2010下工作正常。代码的部分重用自msdn。const DWORD MS_VC_EXCEPTION = 0x406D1388;
#pragma pack(push, 8)
typedef struct THREADNAME_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 threadId, const char* threadName) {
THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = threadName;
info.dwThreadID = threadId;
info.dwFlags = 0;
__try {
RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info );
}
__except(EXCEPTION_EXECUTE_HANDLER) {
}
}
void SetThreadName(boost::thread::id threadId, std::string threadName) {
// convert string to char*
const char* cchar = threadName.c_str();
// convert HEX string to DWORD
unsigned int dwThreadId;
std::stringstream ss;
ss << std::hex << threadId;
ss >> dwThreadId;
// set thread name
_SetThreadName((DWORD)dwThreadId, cchar);
}
这样调用:
boost::thread* thr = new boost::thread(boost::bind(...));
SetThreadName(thr->get_id(), "MyName");
THREADNAME_INFO
结构体和 MS_VC_EXCEPTION
。有没有更好的方法从 boost::thread::id
中获取数字?哎呀。 - David
boost::thread
有一个native_handle
方法,可以用来获取线程的本地API句柄。您需要查看线程库以了解它返回的特定类型以及有关如何使用该句柄为其命名的API文档... - David Rodríguez - dribeas