为何std::this_thread::get_id()与gettid()返回值不同?
为什么
std::this_thread::get_id()与Unix系统gettid()返回值不同? 两者返回值不同的核心原因是它们属于完全不同层面的线程标识,且确实和pthreads密切相关,具体解释如下:
1. 本质定义与作用域差异
gettid()是Unix/Linux的系统调用,返回的是内核级线程ID。这个ID是操作系统内核用来全局唯一标识线程的数值,主线程的tid等于进程的PID,同系统内所有线程的tid不会重复。std::this_thread::get_id()是C标准库提供的抽象接口,返回的是**C标准库层面的线程标识**(类型为std::thread::id)。它的作用是在C++代码中区分不同的线程,具体底层值由标准库实现决定,和内核线程ID没有强制关联。
2. 和pthreads的关联
在Linux平台上,绝大多数C++标准库的std::thread都是基于pthreads库实现的:
std::thread::id的底层通常存储的是pthread_t类型的值,而pthread_t是pthreads库自身用来标识线程的内部句柄,它可能是指针、索引或者其他自定义标识,并非内核线程ID。- 如果需要从C++线程标识获取对应的内核tid,只能依赖平台扩展接口(比如glibc的
pthread_getthreadid_np()),但这类接口是非标准的,不具备跨平台可移植性。
测试代码验证
你的测试代码中,主线程的gettid()会等于当前进程的PID,而std::this_thread::get_id()是标准库生成的独立标识;子线程的两个值也会遵循同样的逻辑,因此两者数值必然不同。
内容的提问来源于stack exchange,提问作者mНBr
相关产品推荐
相关产品推荐

