如何从boost :: thread中检索线程id?

时间:2010-12-28 18:29:15

标签: c++ multithreading boost

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

为了显示或识别目的,访问线程ID的提升方式是什么?

3 个答案:

答案 0 :(得分:44)

太晚了,但是对于寻找答案的用户来说,boost可以像你说的那样查询线程ID,只需调用以下方法:

boost::this_thread::get_id()

此方法从boost返回内部id类型,它不是您想要的数字。但是考虑到id具有十六进制表示,您可以轻松地将此数字转换为例如unsigned long。这个小功能将成为de Job:

#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的链接。

希望这有帮助!

答案 1 :(得分:9)

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

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

答案 2 :(得分:8)

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