[Pthread] Linux上获得线程Id的方法

这篇博客介绍了在Linux系统中,用户态程序获取线程ID的三种方法:通过gettid()系统调用,使用syscall()函数以及利用pthread_self()函数。详细解析了每种方法的实现细节,包括内嵌汇编和glibc库函数的使用。
摘要由CSDN通过智能技术生成
在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中的库函数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值