怎么给一个boost线程命名?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (96)

是否有可能给boost::thread一个名称,以便调试器表和崩溃日志可以更具可读性?怎么样?

提问于
用户回答回答于

你需要访问底层线程原语并以依赖于系统的方式分配名称。调试和崩溃日志本质上依赖于系统,boost :: thread更多地涉及非系统依赖,即关于可移植性。

看起来(http://www.boost.org/doc/libs/1_43_0/doc/html/thread.html)没有书面的方式来访问升级线程的底层系统资源。

用户回答回答于

我在Win32 + VS2010上使用boost 1.50.0,并且thread::native_handle包含我没有设置的与系统中的任何东西配对的数字。另一方面,该thread::get_id()方法直接以十六进制字符串的形式返回窗口线程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");

所属标签

可能回答问题的人

  • 人生的旅途

    10 粉丝484 提问5 回答
  • 无聊至极

    4 粉丝504 提问5 回答
  • 嗨喽你好

    7 粉丝480 提问4 回答
  • 富有想象力的人

    4 粉丝0 提问4 回答

扫码关注云+社区

领取腾讯云代金券