AJG*_*G85 17 c++ multithreading boost
我希望能够在记录时通过简单的id识别线程,以便很容易跟踪单个线程的执行.使用API的Windows GetCurrentThreadId()
可以实现我想要的.在boost::thread
有一个方法get_id()
但这不代表整数的整数值.这个对象有一个thread_data成员,它包含一个似乎是我想要的id,但数据成员是私有的,所以无法访问.
为显示或识别目的访问线程ID的提升方式是什么?
Alv*_*nte 47
太晚了,但是对于寻找答案的用户来说,boost可以像你说的那样查询线程id,只需调用以下方法:
boost::this_thread::get_id()
Run Code Online (Sandbox Code Playgroud)
此方法从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;
}
Run Code Online (Sandbox Code Playgroud)
这将返回如下内容:
4491075584
4491612160
4492148736
4492685312
4493221888
4493758464
4494295040
4494831616
4495368192
4495904768
Run Code Online (Sandbox Code Playgroud)
不要忘记与boost_thread和boost_system的链接.
希望这可以帮助!
Boost包含一个operator<<(std::ostream&, const boost::thread::id&)
重载,可以用来将一个线程id写入一个流(实际上,重载是一个模板,可以用于任何特化std::basic_ostream
,而不仅仅是std::ostream
).
打印id的结果可能是特定于平台的,因为不同的平台可能对线程标识符使用不同的内部表示.
您需要使用成员函数boost::thread::native_handle()
.它返回一个类型native_handle_type
,它是本机线程标识符的实现定义别名,然后可以与本机线程API函数一起使用.
归档时间: |
|
查看次数: |
26707 次 |
最近记录: |