Chinaunix首页 | 论坛 | 博客
  • 博客访问: 828816
  • 博文数量: 157
  • 博客积分: 542
  • 博客等级: 中士
  • 技术积分: 1696
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-21 20:21
文章分类
文章存档

2017年(1)

2016年(2)

2015年(6)

2014年(42)

2013年(77)

2012年(19)

2011年(10)

分类: LINUX

2015-09-08 19:37:04

今天无意中看到了syscall(SYS_gettid) 这个函数,libc中通过kernel的系统调用获得线程的tid,因为以前用pthread_self比较多,所以google了一下两者的区别:


在linux kernel早起是不具有thread的功能的,posix标准在用户态实现了多线程。kernel是在2.4(?)之后才利用进程模拟线程的方式实现的,并且通过posix API来提供给用户。

所以pthread_self只是posix在用户态的一个进程内给一个线程做的identify。不同的进程可能包含相同线程号。
gettid则是相对于整个系统而言的,毕竟用户态所有的资源数据基本上都是需要通过内核统一协调的。如果一个线程是一个进程的主线程,那么gettid等同于getpid即进程号。其它非主线程的线程则kernel会为其分配系统唯一的identify。这里需要注意的是GNU提供的libc并没有直接提供gettid的封装接口,导致用户不能直接通过libc库直接调用函数gettid(),通常都是用syscall(SYS_gettid)来获得。

当然这样一来在linux系统平台上就存在了gettid(N) <——  >pthread_self(1)的情形了。因为pthread_self可能对应到了不同的进程。

所以一般在系统层面的编程需要考虑的是使用gettid来获得唯一identify, 而一般的用户态多线程则使用pthread_self来对应到不同的posix API。
当然gettid是限定在linux kernel或者linux kernel衍生的其它kernel系统。所以在 portable 上有限制。
阅读(1162) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~