免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 35085 | 回复: 12

[函数] linux多线程环境下gettid pthread_self 那个函数获得线程ID [复制链接]

论坛徽章:
0
发表于 2013-09-04 01:11 |显示全部楼层


linux多线程环境下gettid() pthread_self() 两个函数都获得线程ID
linux使用进程模拟线程,gettid 函数返回实际的进程ID
pthread_self 函数返回 pthread_create创建线程时的ID,
我就有点迷惑,
到底那个是线程的ID呢,一个线程不能有两个ID吧

我测试 pthread_self 函数返回的是一个地址,例如:
pid 967--tid 967--  pthread_self b7f5c6c0

请大家答疑解惑了

论坛徽章:
4
双子座
日期:2014-08-28 10:08:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:58:112015年亚洲杯之阿联酋
日期:2015-03-13 03:25:15
发表于 2013-09-04 09:06 |显示全部楼层
gettid是内核中的线程的ID, pthread_self是POSIX thread ID

评分

参与人数 1信誉积分 +5 收起 理由
wwwio + 5 赞一个!

查看全部评分

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
发表于 2013-09-04 10:09 |显示全部楼层
weishuo1999 发表于 2013-09-04 09:06
gettid是内核中的线程的ID, pthread_self是POSIX thread ID


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

论坛徽章:
0
发表于 2013-09-04 10:39 |显示全部楼层
这就有个问题,我们知道一个进程ID唯一的标识一个进程,
但是对一个线程有两个ID,
以那个为准呢?回复 3# myworkstation


   

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
发表于 2013-09-04 11:33 |显示全部楼层
回复 4# tianhailong


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

论坛徽章:
0
发表于 2013-09-04 12:22 |显示全部楼层
使用gettid得到的是系统内唯一的线程标识,自然可以在一个进程内唯一标识那么我们干嘛需要用 POSIX thread ID 呢回复 5# myworkstation

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
发表于 2013-09-04 12:31 |显示全部楼层
回复 6# tianhailong


    gettid是不可移植的。如果你换到别的系统上如何来保证程序的可移植性呢?除非你的程序只在linux上跑。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
发表于 2013-09-04 12:38 |显示全部楼层
gettid返回的id相当于进程id, 可以gdb -p连接上去, 也可以top -H/ps -Lef看到线程状态.

论坛徽章:
0
发表于 2013-09-04 12:41 |显示全部楼层
明白了,其实 POSIX thread ID 是POSIX 标准的,所有遵循POSIX标准的系统都支持,
gettid是linux独有的,
但是如果在linux环境下开发, POSIX thread ID
就是多余的了吧,
那么 gettid 与 POSIX thread ID 有什么对应关系吗?
回复 7# myworkstation

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
发表于 2013-09-04 13:25 |显示全部楼层
回复 9# tianhailong

由于在Linux下POSIX thread 和系统thread是一对一的模型,所以可以认为一个gettid必然对应一个pthread id,但没有什么方法直接实现对两者的对应转换。
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP