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

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的链接.

希望这可以帮助!


Jam*_*lis 9

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

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


Cli*_*ord 8

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

  • @ AJG85:...和`nativehandle()`将为你提供*完全*这样一个唯一的标识符,那么问题是什么?您不必将其用于其他任何事情; 这仅仅是对价值代表的解释; 它实际上*正是*你从'GetCurrentThreadId()`得到的东西.重要的是,此标识符与调试器的*threads*窗口中显示的标识符相同,因此了解其值可能有助于多线程调试. (3认同)