Linux下pthread_t会被快速重用


我最近写的有个程序有点bug,我想加点调试信息,把每个mutex的owner记录下来,谁拿过它,什么时候释放了。然后我意外的发现,pthread_t就跟fd一样,是一个会被快速重用的东西。
测试代码:
#include <iostream> 

void* f(void* p){ 
   std::cout<<"run"<<std::endl; 
} 

int main(){ 
   pthread_t t1; 
   pthread_create(&t1,NULL,f,NULL); 
   pthread_join(t1,NULL); 
   std::cout<<t1<<std::endl; 
   pthread_t t2; 
   pthread_create(&t2,NULL,f,NULL); 
   pthread_join(t2,NULL); 
   std::cout<<t2<<std::endl; 
   std::cout<<pthread_equal(t1,t2)<<std::endl; 
   return 0; 
}
运行结果:
run
139979191514880
run
139979191514880
1
所以一个更好的替代是使用gettid系统调用,获得线程在内核中的task id。但是,glibc拒绝为此系统调用提供封装,所以只能自己写一个封装:
inline pid_t my_gettid(void){
  return syscall(SYS_gettid);
}

update:
Windows下有类似的问题。GetCurrentThreadId()的返回值也是会重复的。我还没找到不重复的替代品。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥