【问题标题】:How to retrieve the thread id from a boost::thread?如何从 boost::thread 中检索线程 ID?
【发布时间】:2011-05-31 17:00:22
【问题描述】:

我希望在记录时能够通过简单的 id 来识别线程,以便轻松跟踪单个线程的执行。用windows使用API​​GetCurrentThreadId()可以实现我想要的。在boost::thread 中有一个方法get_id() 但这并不表示像整数那样的整数值。该对象确实有一个 thread_data 成员,其中包含一个似乎是我想要的 id,但该数据成员是私有的,因此无法访问。

为了显示或识别目的访问线程 id 的增强方式是什么?

【问题讨论】:

    标签: c++ multithreading boost


    【解决方案1】:

    为时已晚,但对于寻找答案的用户,boost 允许按照您所说的查询线程 id,只需调用以下方法:

    boost::this_thread::get_id()
    

    此方法从 boost 中返回一个内部 id 类型,它不是您想要的数字。但是你可以很容易地将这个数字转换为,例如,考虑到 id 具有十六进制表示形式的无符号长整数。这个小功能可以完成任务:

    #include <boost/lexical_cast.hpp>
    #include <boost/thread.hpp>
    
    unsigned long getThreadId(){
        std::string threadId = boost::lexical_cast<std::string>(boost::this_thread::get_id());
        unsigned long threadNumber = 0;
        sscanf(threadId.c_str(), "%lx", &threadNumber);
        return threadNumber;
    }
    
    void drawThreadId(){
        std::cout << getThreadId() << std::endl;
        boost::this_thread::sleep(boost::posix_time::milliseconds(500));
    }
    
    int main() {
        for(int i=0; i<10; i++){
            boost::thread thread = boost::thread(drawThreadId);
        }
        return 0;
    }
    

    这将返回如下内容:

    4491075584
    4491612160
    4492148736
    4492685312
    4493221888
    4493758464
    4494295040
    4494831616
    4495368192
    4495904768
    

    不要忘记与 boost_thread 和 boost_system 的链接。

    希望这会有所帮助!

    【讨论】:

    • 如何从线程对象中获取 ID? (boost::thread mythread)
    【解决方案2】:

    Boost 包含一个 operator&lt;&lt;(std::ostream&amp;, const boost::thread::id&amp;) 重载,可用于将线程 ID 写入流(实际上,重载是一个模板,适用于 std::basic_ostream 的任何特化,而不仅仅是 std::ostream)。

    打印 id 的结果可能是特定于平台的,因为不同的平台可能对线程标识符使用不同的内部表示。

    【讨论】:

    • 所以作为函数的参数,我将传递 boost::thread::id 以与输出流运算符一起使用?这听起来很接近,除非您希望该值在没有流或流运算符的情况下可用?
    • 在线程工作函数中使用 boost::this_thread::get_id() 实际上使用 sprintf_s 样式格式化,不需要参数。
    【解决方案3】:

    您需要使用成员函数boost::thread::native_handle()。它返回一个类型native_handle_type,这是一个实现定义的本机线程标识符的别名,然后可以与本机线程API函数一起使用。

    【讨论】:

    • 虽然知道我需要的只是线程 ID 很有用。在我的情况下,使用 boost::thread 的主要原因是避免特定于操作系统的调用。
    • @AJG85: ... 和nativehandle() 将为您提供完全这样的唯一标识符,那么问题是什么?您不必将其用于其他任何事情;这只是对值代表什么的解释;事实上,正是你从GetCurrentThreadId() 得到的。重要的是,此标识符将与调试器的 threads 窗口中显示的标识符相同,因此了解其值可能有助于多线程调试。
    • 好点。仅仅因为它可以用于本地调用并不意味着它是唯一的用途。另外我相信它等同于您从 GetCurrentThread() 获得的句柄,而不是 GetCurrentThreadId() 返回的整数 id。
    • 谢谢你;可能不是发布问题的最佳答案,但它帮助了我 =]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多