是否可以为 a 命名,boost::thread
以便调试器表和崩溃日志更具可读性?如何?
问问题
11137 次
2 回答
6
您需要访问底层线程原语并以系统相关方式分配名称。调试和崩溃日志本质上是依赖于系统的,而 boost::thread 更多的是关于非系统依赖,即关于可移植性。
似乎(http://www.boost.org/doc/libs/1_43_0/doc/html/thread.html)没有记录的方式来访问提升线程的底层系统资源。(但我自己从未使用过它,所以我可能会错过一些东西。)
编辑:(正如大卫在评论中所写)http://www.boost.org/doc/libs/1_43_0/doc/html/thread/thread_management.html#thread.thread_management.thread.nativehandle
于 2010-07-27T09:39:41.773 回答
4
我在 Win32 + VS2010 上使用 boost 1.50.0 并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");
于 2012-07-16T13:25:18.093 回答