首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从一个boost::thread中检索线程id?

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

Stack Overflow用户
提问于 2010-12-29 02:29:15
回答 3查看 30.1K关注 0票数 19

我希望在记录日志时能够通过简单的id来识别线程,这样就可以很容易地跟踪单个线程的执行情况。有了windows,使用API,GetCurrentThreadId()就可以实现我想要的功能。在boost::thread中有一个方法get_id(),但它不像整数那样表示整数值。这个对象有一个thread_data成员,它包含一个我想要的id,但是这个数据成员是私有的,所以不能被访问。

为了显示或识别目的而访问线程id的boost方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-29 02:32:45

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

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

票数 10
EN

Stack Overflow用户

发布于 2013-06-20 17:27:46

太晚了,但是对于寻找答案的用户,boost允许像您所说的那样查询线程id,只需调用以下方法:

代码语言:javascript
运行
复制
boost::this_thread::get_id()

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

代码语言:javascript
运行
复制
#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;
}

这将返回如下内容:

代码语言:javascript
运行
复制
4491075584
4491612160
4492148736
4492685312
4493221888
4493758464
4494295040
4494831616
4495368192
4495904768

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

希望这能有所帮助!

票数 52
EN

Stack Overflow用户

发布于 2010-12-29 02:48:13

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4548395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档