Chinaunix首页 | 论坛 | 博客
  • 博客访问: 255991
  • 博文数量: 99
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 246
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-03 18:23
个人简介

qrasvasdf

文章分类

全部博文(99)

文章存档

2016年(1)

2015年(36)

2014年(62)

我的朋友

分类: LINUX

2014-10-13 09:51:38

linux多线程环境下gettid() pthread_self() 两个函数都获得线程ID

pid_t gettid()     //是个非负数,内核提供的进程的唯一的标识
pthread_t pthread_self()   //是个地址,是libc中的pthread线程结构的首地址

gettid是内核中的标识进程(linux中线程即进程)的ID, pthread_self是POSIX thread ID

线程库实际上由两部分组成:内核的线程支持+用户态的库支持(glibc),Linux在早期内核不支持线程的时候glibc就在库中(用户态)以线程(就是用户态线程)的方式支持多线程了,POSIX thread只要求了用户编程的调用接口,对内核接口没有要求,因此pthread_t是跨平台的。linux上的线程实现就是在linux内核支持的基础上以POSIX thread的方式对外封装了接口,所以才会有两个ID的问题

POSIX thread ID可以在一个进程内唯一标识一个线程,由POSIX线程函数使用。但如果放到系统范围内的话就得用gettid了,
gettid是不可移植的。

gettid返回的id相当于进程(linux下线程都是进程模拟的)id, 可以gdb -p连接上去, 也可以top -H/ps -Lef看到此线程,
/proc/pid/task/taskid,这里的taskid也是此id。
对应的 在线程中调用pthread_self返回的id和pthread_create中传出的 id是同一个id

由于在Linux下POSIX thread 和系统thread是一对一的模型,所以可以认为一个gettid必然对应一个pthread id,
但没有什么方法直接实现对两者的对应转换。

阅读(4480) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~