Linux线程ID是32位的,对于linux中线程id的讨论
在LINUX系统中,POSIX threads库提供了pthread_t来标识一个线程,通过pthread_self()可以得到,如下:
#include
#include
using namespace std;
void* thread_func(void*)
{
//pthread_t other_thread_id = pthread_self();
//cout << "other_thread_id=" << other_thread_id << endl;
return NULL;
}
int main(int argc, char *argv[])
{
pthread_t t1, t2;
pthread_create(&t1, NULL, thread_func, NULL);
cout << t1 << endl;
pthread_join(t1, NULL);
//pthread_create(&t2, NULL, thread_func, NULL);
//cout << t2 << endl;
//pthread_join(t2, NULL);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
得到结果:
typedef unsigned long int pthread_t;
这个数值很大。而且比较两个线程是否相同也需要用pthread_equal(pthread_t t1, pthread_t t2)来比较。
那么,使用pthread_t来标识线程id是否是最合适的?
答案是否
原因:这个pthread_t的值很大,无法作为一些容器的key值。
pthread_t是由POSIX pthread库内部提供的,只在进程内部有意义,无法关联操作系统的任务调度之类的信息。比方说在/proc查找不到关于pthread_t得到的task。
glibc的Pthreads实现实际上把pthread_t作为一个结构体指针,指向一块动态分配的内存,但是这块内存是可以反复使用的,也就是说很容易造成pthread_t的重复。也就是说pthreads只能保证同一进程内,同一时刻的各个线程不同;不能保证同一个进程全程时段每个线程具有不同的id,不能保证线程id的唯一性。下面可以通过一个例子:
#include
#include
using namespace std;
void* thread_func(void*)
{
//pthread_t other_thread_id = pthread_self();
//cout << "other_thread_id=" << other_thread_id << endl;
return NULL;
}
int main(int argc, char *argv[])
{
pthread_t t1, t2;
pthread_create(&t1, NULL, thread_func, NULL);
cout << t1 << endl;
pthread_join(t1, NULL);
pthread_create(&t2, NULL, thread_func, NULL);
cout << t2 << endl;
pthread_join(t2, NULL);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
运行结果:
上述原因显然表明pthread_t是不适合作为线程的标识的。所以应该使用什么来标识呢。
首先对于进程id,有函数getpid返回的pid_t来标识。那么线程有没有类似的gettid来标识呢。
在LINUX系统中,建议使用gettid系统调用的返回值作为线程id,这么做的原因:
返回值是一个pid_t,其值是一个很小的整数,方便输出。
在linux系统中,它直接标识内核任务调度id,可通过/proc文件系统中找到对应项:/proc/tid 或者 /proc/pid/task/tid,方便定位到具体线程
任何时刻都是唯一的,并且由于linux分配新的pid采用递增轮回办法,短时间内启动多个线程也会具有不同的id
0是非法值,操作系统第一个进程init的pid是1
glibc没有封装这个gettid,需要我们手动封装。
举例:
#include
#include
#include //获取线程id的系统调用头文件
#include
#include
using namespace std;
void* thread_func(void*)
{
//获取线程id的系统调用
cout << syscall(__NR_gettid) << endl;
return NULL;
}
int main(int argc, char *argv[])
{
pthread_t t1, t2;
pthread_create(&t1, NULL, thread_func, NULL);
cout << t1 << endl;
pthread_join(t1, NULL);
pthread_create(&t2, NULL, thread_func, NULL);
cout << t2 << endl;
pthread_join(t2, NULL);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
结果:
和pthread_t的描述完全不一样。
使用比较优雅的方式是定义一个gettid的宏
#include //获取线程id的系统调用头文件
#include
#include
//定义宏
#define gettid() syscall(__NR_gettid)
1
2
3
4
5
6
验证TID是否正确的方法:
查看进程pid
(1) ps ux | grep prog_name
(2) pgrep prog_name
查看线程tid
(1) ps -efL | grep prog_name
(2) ls /proc/pid/task
————————————————
版权声明:本文为CSDN博主「ZgZeQi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zeqi1991/article/details/81611919
Linux线程ID是32位的,对于linux中线程id的讨论相关推荐
- win10子系统linux下cmake编译32位程序
文章目录 Ubuntu 18运行32位程序 添加软件源 安装编译环境 编写CMakeLists.txt cmake编译 运行程序 SUSE 15.0运行32位程序 m32编译 添加软件源 安装qemu ...
- linux 32位中文版,topogun linux|TOPOGUN For linux v2.0.13647中文免费版 64位/32位 - 121下载站...
topogun是一款独立跨平台的拓补软件,软件可以兼容win.mac.linux等操作系统,小编为大家带来的这个是topogun 2.0 linux版本,适用于32位.64位操作系统,软件拥有强大的友 ...
- linux版本查看命令多少位,查看linux系统版本命令32位还是64位
有的时候不知道我安装的是Linux 64位的还是Linux32位的,因为下载页面常常同时提供32位和64位版本的软件.所以弄清楚你的操作系统是32位的还是64位的十分重要,那么怎么查看linux系统版 ...
- 在 QEMU 上运行 RISC-V 32 位版本的 Linux
前言 最近中科院软件所PLCT实验室要开始基于 OpenJDK11 进行 RISC-V 32G 的移植工作,需要搭建好 RISC-V 32 位的 Linux 环境,本文就是介绍 RISC-V 32 位 ...
- linux 查看系统版本 32位 or 64位
1.#uname -a 如果有x86_64就是64位的,没有就是32位的 2.# uname -m x86_64 3.# arch x86_64 4.#file /bin/cat /bin/cat: ...
- putty 32位_了解linux系统远程操作软件,putty的安装过程!
linux小白到大神的成长之路:了解linux系统远程操作软件,putty的安装过程! 本经验由宗龙龙原创,全文共600多字,阅读需要14分钟,如果文中存在错误,还请大家多多指点,我会积极改进的! 前 ...
- Linux下的32位C程序,linux系统c语言生成.so文件,生成64位可执行文件,在64位系统中运行32位的可执行文件...
1.linux 系统c语言生成.o文件,---->gcc -m64 -c -fPIC test.c -o test.o 2.linux 系统c语言生成.so文件,----->gcc -sh ...
- 查看linux版本32还是64位,查看linux系统版本是32位的还是64位的
一. [root@linuxzgf ~]#getconf LONG_BIT [root@linuxzgf ~]#getconf WORD_BIT (32位的系统中int类型和long类型一般都是4字节 ...
- 32位uefi引导64位Linux,维护版win8pe(32位+64位+纯64位,支持BIOS+EFI)
此文件包的ISO格式,下载后解压即可得到ISO文件. 本合盘启动方式支持BIOS+32位EFI+64位EFI启动.写入方式支持量产,刻盘,B+,U+(不隐藏.普通隐藏.高端隐藏).最大化支持新老机型启 ...
最新文章
- 做不了爱人,我们做什么?
- 使用Outlook 2007连接到Exchange Server 2003、2007时出现没有默认网关的错误
- php中对象的遍历输出,PHP中的对象遍历技巧
- SIP协议(基础技术知识)
- (pytorch-深度学习)循环神经网络
- Basic4android v3.50 发布
- 华为Mate 40工程机曝光:并未采用屏下摄像头
- 计算机专业开学要带电脑吗,大学新生刚开学需要带电脑吗
- 吸收塔如何提高吸收率_缺钙了该如何补钙?饮食补钙更健康
- opencv绘制基本形状的二值图像
- 计算入瞳、出瞳位置及孔径大小
- 冰点还原容易出现的问题总结
- 【JS 逆向百例】某音 X-Bogus 逆向分析,JSVMP 纯算法还原
- IBM沃森Watson答题过程全揭秘
- 安装SqlServer 2008 R2时出现程序兼容性问题
- win10电脑蓝屏自动修复失败无法开机的解决
- 在Python中画炫酷的K线图
- linux du命令 前多少个,Linux du命令查看文件夹大小并按降序排列
- 立足信息时代起点 探索企业营销新模式
- 教大家如何把pdf转成dwg格式的cad文档
热门文章
- Vue.js 上传文件(后台使用.net)
- 计算机二级是报office还是vb,请问一下计算机二级中,高阶office好考,还是VB好考?...
- 文本加密算法matlab,matlab希尔加密算法
- 嘿,老李,又在写BUG呢?
- 死磕算法!35 篇算法设计实例+6 本超赞好书打包送你
- 未来已来!分布式数据库的“星辰大海”绝不仅限于替换!
- 优酷响应式在消费场景的落地之 iOS 篇
- 两天,我把分布式事务搞完了!
- CSDN 创始人蒋涛:选择长沙作“大本营”,打造开发者中心城市
- 震惊!谷歌专家爆料:Python和AI这回真的玩大了!网友:好方法!