我希望在记录日志时能够通过简单的id来识别线程,这样就可以很容易地跟踪单个线程的执行情况。有了windows,使用API,GetCurrentThreadId()
就可以实现我想要的功能。在boost::thread
中有一个方法get_id()
,但它不像整数那样表示整数值。这个对象有一个thread_data成员,它包含一个我想要的id,但是这个数据成员是私有的,所以不能被访问。
为了显示或识别目的而访问线程id的boost方法是什么?
发布于 2010-12-29 02:32:45
Boost包含一个operator<<(std::ostream&, const boost::thread::id&)
重载,可用于将线程id写入流(实际上,该重载是一个模板,可用于std::basic_ostream
的任何专门化,而不仅仅是std::ostream
)。
打印id的结果可能是特定于平台的,因为不同的平台可能对线程标识符使用不同的内部表示。
发布于 2013-06-20 17:27:46
太晚了,但是对于寻找答案的用户,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的链接。
希望这能有所帮助!
发布于 2010-12-29 02:48:13
您需要使用成员函数boost::thread::native_handle()
。它返回一个类型native_handle_type
,它是本机线程标识符的实现定义的别名,然后可以与本机thread API函数一起使用。
https://stackoverflow.com/questions/4548395
复制相似问题