在linux2.4版本后,linux使用了NPTL作为自己的线程库,为了兼容POSIX标准,所以在内核task中有两个域tgid和tid,前者是进程id,后者是线程id。在linux上获得线程id的方法,目前我所知的有三种,当然这里的三种是指在用户态的程序中,否则除非自己写的kernel module, 都是调用编号224的系统调用实现的(2.6版本)。
第一种: gettid(), man gettid 可以看到gettid的使用方式。
使用时要先定义:_syscall0(pid_t, gettid)
其中_syscall0是一个宏(由于参数的不同还有_syscall1,_syscall2...),定义如下:
#define _syscall0(type,name) /
type name(void) /
{ /
long __res; /
__asm__ volatile ("int $0x80" / //int 80, 软中断
: "=a" (__res) / //输入输出都用的eax
: "0" (__NR_##name)); / //#define __NR_gettid 224
__syscall_return(type,__res); / //返回tid
}
编译时,宏展开之后,相当于定义了一个pid_t gettid(void)函数,用内嵌汇编实现,在程序中就可以使用gettid()获得线程id了。
第二种:syscall(), 名字叫syscall(),却是glibc中的库函数。
第一种: gettid(), man gettid 可以看到gettid的使用方式。
使用时要先定义:_syscall0(pid_t, gettid)
其中_syscall0是一个宏(由于参数的不同还有_syscall1,_syscall2...),定义如下:
#define _syscall0(type,name) /
type name(void) /
{ /
long __res; /
__asm__ volatile ("int $0x80" / //int 80, 软中断
: "=a" (__res) / //输入输出都用的eax
: "0" (__NR_##name)); / //#define __NR_gettid 224
__syscall_return(type,__res); / //返回tid
}
编译时,宏展开之后,相当于定义了一个pid_t gettid(void)函数,用内嵌汇编实现,在程序中就可以使用gettid()获得线程id了。
第二种:syscall(), 名字叫syscall(),却是glibc中的库函数。