今天无意中看到了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) |