Linux下获得线程ID syscall(224)

From: http://blog.163.com/onx0320@126/blog/static/164736436201252574720314/


对于Linux线程,也许大家并不陌生,而我们通常所说的线程是指基于POSIX标准的线程,而Linux下除了兼容POSIX标准,而且提供线程在内核级的支持。
    早在Linux kernel2.4之前,Linux的线程(LinuxThread)属于用户级,内核根本不知道线程的存在,为了得到内核的支持,2003 年,Redhat公司(很了不起的一个公司)发布了NPTL(Native POSIX Thread Library),至今广泛使用。
    NPTL很优秀,对信号的处理是按照每进程的原则进行的;getpid() 会为所有的线程返回相同的进程 ID。例如,如果发送了 SIGSTOP 信号,那么整个进程都会停止;使用 LinuxThreads,只有接收到这个信号的线程才会停止。这样可以在基于 NPTL 的应用程序上更好地利用调试器,例如 GDB。
    额外话说多了,下面具体看看下面如何获得线程的ID吧!
   
    经常我们需要在程序一个线程中获得这个线程的id,有人会说,可以通过pthread_create函数传递参数传入,等主线程创建子线程成功,那么这个pid会自动赋值
#define TNUM 2
struct BN
{
    pthread_t pid;
    int N;
};

void *run(void *args)
{
    BN *recive = (BN *)args;
    cout << "pid: " << recive->pid << endl;
    return (void *)(recive->N);
}

int main(int c, char *v[])
{
    int i;
    int ret;
    char *result;
    pthread_t pid[TNUM];
    BN bn[TNUM];

    for (i = 0; i < TNUM; i ++)
     {
        bn[i].pid = pid[i];
        bn[i].N = mN;
        ret = pthread_create(&pid[i], NULL, run, &bn[i]);
    //...出错处理
    }
    return 0;
}
   难题是主线程去分配子线程id的时刻,run函数并不能很确切的知道,所以当读取recive->pid时,就会产生错误;
    正确的方法应该使用pthread_self()函数来获得POSIX的线程id,此函数调用内部进制直到pid分配完成。
    有人会问,获取进程id的函数不是getpid(),获取线程id的函数不是gettid()么?
这里与刚才前面所说的有些关系,目前gettid获得的pid是需要系统调用(syscall)的,这个syscall返回的pid不是上面所说的POSIX线程id,这个是内核的线程id,具体调用的方式如下:
pid_t pid = syscall(SYS_gettid);

pid_t pid = syscall(__NR_gettid);

//仅限于i386,如果是x86_64,则调用186
pid_t pid = syscall(224);
以往旧的方式syscallx的调用已经被废弃。
    看到这里,也许有人会问,pid_t和pthread_t可以相互转换么?一个是POSIX的线程、一个是内核的线程?如果你感兴趣在这方面研究的话,可以不妨试试,答案肯定是可以的。

    至此,你看完这篇文章,明白了linux线程id怎么获得了么?



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

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

相关文章

Qt中常用的QChar QByteArry QString数据类型转换方法

一、QChar类型 转 QByteArry类型 char mybuffer[mybufferSize]; QByteArray ByteData QByteArray(mybuffer, mybufferSize);二、QByteArry类型 转 QString类型 QByteArray _byte; QString string&#xff0c;_string1; string QString(_byte); _string1 QString(_byte.toH…

android studio 安装问题,解决Android Studio的安装问题

今天开始了android studio的下载与安装&#xff0c;我再官网上下载了Android studio,下载不难&#xff0c;运行出来可需要一定的时间&#xff0c;在中途中我遇到了一些问题一&#xff1a;Build错误&#xff1a;在我最开始下载完Android studio时&#xff0c;我新建项目的时候&a…

React开发(231):常见手机号邮箱的正则

// 手机号 const isPhone /^1[3-9]\d{9}$/; // const isPhone /(\d{3}-|\d{4}-)?(\d{8}|\d{7})?/;// 邮箱 const isEmail /^([A-Za-z0-9_\-\.])\([A-Za-z0-9_\-\.])\.([A-Za-z]{2,4})$/; // 密码格式 const isPassword /^[\w~!#$%^&*()-|\\<>,.?/\[\]{}:;&qu…

用JS访问iframe中的元素

用JS访问iframe中的元素 &#xff11;.首先&#xff0c;如何访问iframe中的元素&#xff1f;见如下代码&#xff1a;(1)1.htm源码&#xff1a;<input typebutton value"test" οnclick"self.frames[a].document.all.mybutton.disabledtrue"> <…

诺基亚7原生android,【诺基亚7Plus评测】系统:简洁原生安卓功能却不简单_诺基亚 7 Plus(4GB RAM/全网通)_手机评测-中关村在线...

系统&#xff1a;简洁原生安卓功能却不简单诺基亚 7 Plus的系统为Android 8.0&#xff0c;与国内厂商大刀阔斧的定制化相反&#xff0c;诺基亚 7 Plus的系统几近原生&#xff0c;仅仅内置了微信、微博、支付宝三款国民应用&#xff0c;而且这三个软件都可以卸载&#xff0c;最大…

React开发(232):传参可以转变思路

handleSearch (values) > {console.log(values, values);let startDate (values?.startTime && new Date(values?.startTime[0]).getTime()) || ;let endDate (values?.startTime && new Date(values?.startTime[1]).getTime()) || ;let checkStartD…

八皇后问题(回溯法)

#include<iostream> using namespace std; #define N 8 //N代表皇后数 void queen() { int Count0; //计算总共的解的数量 int column[N1]; //column[m]n表示第m行&#xff0c;第n行放置了皇后,这里下表并从0开始 int row[N1]; //row[m]1表示第m行没有皇后&#xff0c;0表…

air android 通信,Android超声波通信例子

【实例简介】Android超声波通信例子,手机之间,手机与超声波设备间的超声波通信【实例截图】【核心代码】ComAir5Demo_V1.0.3└── ComAir5Demo_V1.0.3├── AndroidManifest.xml├── ComAir5Demo_ReleaseNote.txt├── libs│ ├── android-support-v4.jar│ └──…

React开发(234):windows.onresize

定义和用法 onresize 事件会在窗口或框架被调整大小时发生。 语法 In HTML: <element οnresize"SomeJavaScriptCode"> JavaScript 中: window.οnresizefunction(){SomeJavaScriptCode};

ExtJs UI框架学习六

ExtJS中get、getDom、getCmp、getBody、getDoc的使用 Ext中包含了几个以get开头的方法&#xff0c;这些方法可以用来得到文档中DOM、得到当前文档中的组件、得到Ext元素等&#xff0c;在使用中要注意区别使用。 1、get方法 get方法用来得到一个Ext元素&#xff0c;也就是类型为…

html文字置顶标签,HTML的marquee标签怎么用?

在HTML中&#xff0c;标签用于在网页中创建滚动文本或图像&#xff1b;可以从水平向左或向右或向右或向左滚动&#xff0c;也可以从上到下或从下到上滚动。marquee元素是成对出现的&#xff0c;下面是标签的一些属性列表&#xff1a;示例1&#xff1a;Marquee标签.main {text-a…

【普通の随笔】6.30

2015年的一半差几个小时也要过去了。 貌似今晚是多加了一秒“闰秒”&#xff0c;今晚可以多睡一秒了&#xff08;然并卵 自从某ACM金牌师兄来讲了次网络流后&#xff0c;自己也停止BZOJ的刷题了&#xff0c;专心学各种新算法。 于是就整理出了这么长的列表。。。这些都是我不会…

清除WIN7桌面背景历史记录

昨天下了咱们官方出品的“2011年1月IT人个性桌面壁纸”。自己使得是WIN7&#xff0c;应用方法就是在桌面上右键——个性化&#xff0c;然后选择“桌面背景”&#xff0c;再通过“浏览”按钮找到指定位置即可&#xff0c;或者干脆直接在图片上右键——设置为桌面背景&#xff0c…

React开发(235):react可以这样返回dom

bottomBtns const bottomBtns (<div style{{ display: flex, justifyContent: flex-end, marginTop: 16 }}><Button onClick{this.handleBack}>返回</Button><Button style{{ marginLeft: 16px }} onClick{() > this.save(save)}>保存</Butto…

html透明页面锁定窗口,CSS弹出背景半透明窗口

弹出窗口,背景半透明body{margin:0px;}#bg{width:100%;height:100%;top:0px;left:0px;position:absolute;filter: Alpha(opacity50);opacity:0.5; background:#000000; display:none;}#popbox{position:absolute;width:400px; height:400px; left:50%; top:50%; margin:-200px …

python3.4学习笔记(九) Python GUI桌面应用开发工具选择

python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96.html 为什么用Python开发桌面应用程序_yu000hong_新浪博客http://blog.sina.com.cn/s/blog_48a45b950100zhwx.html 鱼C工作室-免费Python教学…

O_RDWR, O_CREAT等open函数标志位在哪里定义?

查了下O_RDWR, O_CREAT等定义&#xff0c;终于找到了。 我的系统是Fedora12, 其定义在文件&#xff1a;/usr/include/asm-generic/fcntl.h&#xff0c;部分定义如下&#xff1a; #include <linux/types.h>/* open/fcntl - O_SYNC is only implemented on blocks device…

Qt弹出的窗口始终位于界面最前面的方法

一、描述 自定义窗口控件标志用于启用自定义窗口控件。调用setWindowFlags&#xff08;type&#xff09;函数。 type参数&#xff1a; Qt::CustomizeWindowHint 关闭默认窗口标题提示。Qt::WindowTitleHint 给窗口一个标题栏Qt::WindowSystemMenuHint添加窗口系统菜单&…

VIM 替换(转)

VIM中常用的替换模式总结。0&#xff0c;:g/null/d找到null的行并且删掉1&#xff0c;简单替换表达式替换命令可以在全文中用一个单词替换另一个单词&#xff1a;:%s/four/4/g“%” 范围前缀表示在所有行中执行替换。最后的 “g” 标记表示替换行中的所有匹配点。如果仅仅对当前…