在linux上获得线程id的方法

From: http://www.linuxidc.com/Linux/2014-01/94723.htm

我使用了第二种方法,很方便:

#define gettid() syscall(__NR_gettid)

用到的地方 gettid()

在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...),定义如下:

QUOTE:
#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中的库函数。 

使用方式:syscall(__NR_gettid), 其中__NR_gettid就是224,同上。 

syscall的实现要到glibc中去找,不同的硬件平台有不同的实现版本,在i386上的实现在syscall.S中:

QUOTE:
#include 
.text 
ENTRY (syscall) 
PUSHARGS_6 /* Save register contents. */ 
_DOARGS_6(44) /* Load arguments. */ 
movl 20(%esp), %eax /* Load syscall number into %eax. */ 
ENTER_KERNEL /* Do the system call. */ 
POPARGS_6 /* Restore register contents. */ 
cmpl $-4095, %eax /* Check %eax for error. */ 
jae SYSCALL_ERROR_LABEL /* Jump to error handler if error. */ 
L(pseudo_end): 
ret /* Return to caller. */ 
PSEUDO_END (syscall)


其中ENTRY也是一个宏,展开了相当的长,主要用于在链接的时候让gcc能够"看见"并调用这段用汇编写成的syscall()函数。 

第三种:pthread_self() 

同样是一个glibc提供的函数,在linux的manual中说返回的是当前线程的thread ID.但是实际你看到的是一个很长的,似乎没有规律的值。什么原因得看看它的实现: 

在glibc中,pthread_self()返回的是THREAD_SELF,这又是一个宏 

定义如下

QUOTE:
# define THREAD_SELF \ 
({ struct pthread *__self; \ 
asm ("movl %%gs:%c1,%0" : "=r" (__self) \ 
: "i" (offsetof (struct pthread, header.self))); \ 
__self;})


这段代码返回了当前线程的descriptor,pthread_self()得到的就是这个descriptor的地址, 也就是unsigned long int类型的pthread_t。知道了这一点就好办了,找到thread descriptor的定义:

QUOTE:
struct pthread 
{ 
... 
pid_t tid; 
... 
}


接下来知道怎么做了吗?算好长度n,构造一个假的pthread结构。

QUOTE:
struct pthread_fake 
{ 
void *nothing[n]; 
pid_t tid; 
};


用(struct pthread_fake *) pthread_self()->tid得到线程id了。

相比前两种做法,这种无疑是最繁琐的,但是同理,可以获取很多glibc中维护了,但是没有提供访问方法的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MCAL】TC397+EB-treso之MCU配置实战 - 芯片时钟

本篇文章介绍了在TC397平台使用EB-treso对MCU驱动模块进行配置的实战过程,主要介绍了后续基本每个外设模块都要涉及的芯片时钟部分,帮助读者了解TC397芯片的时钟树结构,在后续计算配置不同外设模块诸如通信速率,定时器周期等&…

html引入UI库vant

vant地址 注意html中不支持单标签元素 元素标签必须是闭合标签 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta nam…

nunjucks渲染富文本解析错误输出字符串而不是元素

今天遇到个坑&#xff0c;nunjucks 的插入变量{{}}输出的是字符串&#xff0c;而我用富文本编辑器插入数据库的是字符串&#xff0c;它不解析成元素(html),怎么办&#xff1f; 用什么方法引入它能成html&#xff1f; 网上查&#xff0c;没这个资料 因为以前用过EJS输出过字符…

ubuntu下安装、卸载软件

2019独角兽企业重金招聘Python工程师标准>>> 安装&#xff1a;(1) apt-get install name 卸载&#xff1a;(1) apt-get remove name 卸载并清除配置&#xff1a;(1) apt-get remove --purge name 更新信息库&#xff1a;apt-get update 系统升级&#xff1a;apt-get…

英文版Ubuntu 安装中文输入法

一、安装语言包 &#xff08;系统默认会安装中文简体语言包&#xff09; System Settings-->Language Support-->Install/Remove Languages 二、安装IBUS框架 sudo apt-get install ibus ibus-clutter ibus-gtk ibus-gtk3 ibus-qt4 三、安装中文引擎 Ibus 拼音&#xff1…

Linux获取线程id的方法学习

From: http://www.linuxidc.com/Linux/2014-01/94723.htm 最近一直在想&#xff1a; 如何确认两段代码是不是在同一个线程中执行的呢&#xff1f; 通过查看资料&#xff0c;发现一种比较简单的方法就是在代码中使用printf将当前线程的id打印出来。 而这也分成两种情况&#x…

console使用

console.log用于控制台打印&#xff1b;但除此之外console还有很多用处 1.分组打印console.group(分组打印1-2)console.log(1);console.log(2);console.groupEnd()console.group(分组打印3-4)console.log(3);console.log(4);console.group(俄罗斯套娃)console.log(5);console.…

Linux平台上搭建apache+tomcat负载均衡集群

传统的Java Web项目是通过tomcat来运行和发布的。但在实际的企业应用环境中&#xff0c;采用单一的tomcat来维持项目的运行是不现实的。tomcat 处理能力低&#xff0c;效率低&#xff0c;承受并发小&#xff08;1000左右&#xff09;。当用户请求较少时&#xff0c;单一的tomca…

(转)C#中 DirectoryEntry组件应用实例

C#中 DirectoryEntry组件应用实例DirectoryEntry类封装Active Directory层次结构中的节点或对象&#xff0c;使用该类可以绑定到对象&#xff0c;或者读取和更新属性。图1所示为DirectoryEntry组件。DirectoryEntry组件1&#xff0e; 功能DirectoryEntry类封装Active Director…

小程序设置header cookie

代码片段 method: POST,url: config.service.balabala,data: this.data.balabala,header: { cookie: demobalabala;loginbalabala},success: function (data) {

【Linux学习】epoll详解

From: http://blog.csdn.net/xiajun07061225/article/details/9250579 什么是epoll epoll是什么&#xff1f;按照man手册的说法&#xff1a;是为处理大批量句柄而作了改进的poll。当然&#xff0c;这不是2.6内核才有的&#xff0c;它是在2.5.44内核中被引进的(epoll(4) is a …

Windows Server Backup 2012设置备份周期

Windows Server Backup 2012设置备份周期 作者&#xff1a;杨坚 Windows Server Backup 概述 Windows Server Backup 功能提供一组向导及其他工具&#xff0c;您可用来对服务器执行基本的备份和恢复任务。自首次发布 Windows Server 2008 以来&#xff0c;此功能已得到更新。另…

JSP作业1--5!

输出5的阶乘 <body> <!-- 5的阶乘--> <% int s1; for(int j1;j<6;j){ %> <%s*j; %><% }%> <br> 5的阶乘是&#xff1a; <%s %> 结果&#xff1a; 转载于:https://www.cnblogs.com/miss123/p/5611038.html

js冒泡排序,简单的冒泡排序

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>冒泡排序</title><script type"text/javascript">var arr [3, 12, 5, 8988, 90, 789, 122, 15];function maopao() {for (var …

Yii Zii.widgets.Cmenu 操作

为什么80%的码农都做不了架构师&#xff1f;>>> $this->widget(zii.widgets.CMenu, array( activeCssClass>当前热点元素的样式, firstItemCssClass>第一个元素的样式, lastItemCssClass>最后一个元素的样式, encodeLable>false //這樣&#xff…

pc端vue项目打开pdf文件;网页查看pdf文件;浏览器直接打开pdf文件

//要求url是可以直接在地址栏打开的pdf地址//url https://push-repair.zuihuibao.cn/ACHC00DE0421FP00359D.pdf?e1629447429&tokenvuxdWg0Cy8FEDKDawxk2AJ2Mq9guC8xVHBddeMpk:vLCjXt5DOOUAevOJlURN5epC1CsdlBkddPdf (url) {var a document.createElement("a")…

比较分析 Spring AOP 和 AspectJ 之间的差别

比较分析 Spring AOP 和 AspectJ 之间的差别 英文原文&#xff1a;Comparative Analysis Between Spring AOP and AspectJ 标签&#xff1a; AspectJ Spring158人收藏此文章, 我要收藏oschina 推荐于 3年前 (共 7 段, 翻译完成于 10-24) (19评) 参与翻译(2人)&#xff1a; bear…

linux下Epoll实现简单的C/S通信

From: http://blog.csdn.net/piaojun_pj/article/details/6103709 epoll的优点&#xff1a; 1.支持一个进程打开大数目的socket描述符(FD) select 最不能忍受的是一个进程所打开的FD是有一定限制的&#xff0c;由FD_SETSIZE设置&#xff0c;默认值是2048。对于那些需要支持…

什么是跨域?跨域如何解决

什么是跨域&#xff1f; A页面访问B页面的资源&#xff0c;如果A&#xff0c;B页面的域名、端口、协议、IP其中一个不同&#xff0c;这种行为都叫跨域&#xff1b; 它是由于浏览器的同源策略形成的&#xff0c;也是对javascript的安全限制&#xff1b; 什么是同源&#xff1…

微信小程序打开pdf文件;uni-app下载打开pdf文件;uni-app微信小程序下载打开pdf文件预览;

1.首先需要在小程序后台-开发设置-服务器域名 配置好下载的域名。不配置&#xff1a;会导致下载失败和打开文件失败&#xff1b; 2.pdf文件的url要确保可以浏览器直接打开。 <template><view class"pdf"><view v-for"(item,index) in pdfList&q…