linux中有关线程标识摘记

1160阅读 0评论2015-09-08 jonas_mao
分类:LINUX

今天无意中看到了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 上有限制。
上一篇:关于copy_from_user函数
下一篇:ELF文件和BIN文件