在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的讨论相关推荐

  1. win10子系统linux下cmake编译32位程序

    文章目录 Ubuntu 18运行32位程序 添加软件源 安装编译环境 编写CMakeLists.txt cmake编译 运行程序 SUSE 15.0运行32位程序 m32编译 添加软件源 安装qemu ...

  2. linux 32位中文版,topogun linux|TOPOGUN For linux v2.0.13647中文免费版 64位/32位 - 121下载站...

    topogun是一款独立跨平台的拓补软件,软件可以兼容win.mac.linux等操作系统,小编为大家带来的这个是topogun 2.0 linux版本,适用于32位.64位操作系统,软件拥有强大的友 ...

  3. linux版本查看命令多少位,查看linux系统版本命令32位还是64位

    有的时候不知道我安装的是Linux 64位的还是Linux32位的,因为下载页面常常同时提供32位和64位版本的软件.所以弄清楚你的操作系统是32位的还是64位的十分重要,那么怎么查看linux系统版 ...

  4. 在 QEMU 上运行 RISC-V 32 位版本的 Linux

    前言 最近中科院软件所PLCT实验室要开始基于 OpenJDK11 进行 RISC-V 32G 的移植工作,需要搭建好 RISC-V 32 位的 Linux 环境,本文就是介绍 RISC-V 32 位 ...

  5. 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: ...

  6. putty 32位_了解linux系统远程操作软件,putty的安装过程!

    linux小白到大神的成长之路:了解linux系统远程操作软件,putty的安装过程! 本经验由宗龙龙原创,全文共600多字,阅读需要14分钟,如果文中存在错误,还请大家多多指点,我会积极改进的! 前 ...

  7. 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 ...

  8. 查看linux版本32还是64位,查看linux系统版本是32位的还是64位的

    一. [root@linuxzgf ~]#getconf LONG_BIT [root@linuxzgf ~]#getconf WORD_BIT (32位的系统中int类型和long类型一般都是4字节 ...

  9. 32位uefi引导64位Linux,维护版win8pe(32位+64位+纯64位,支持BIOS+EFI)

    此文件包的ISO格式,下载后解压即可得到ISO文件. 本合盘启动方式支持BIOS+32位EFI+64位EFI启动.写入方式支持量产,刻盘,B+,U+(不隐藏.普通隐藏.高端隐藏).最大化支持新老机型启 ...

最新文章

  1. 做不了爱人,我们做什么?
  2. 使用Outlook 2007连接到Exchange Server 2003、2007时出现没有默认网关的错误
  3. php中对象的遍历输出,PHP中的对象遍历技巧
  4. SIP协议(基础技术知识)
  5. (pytorch-深度学习)循环神经网络
  6. Basic4android v3.50 发布
  7. 华为Mate 40工程机曝光:并未采用屏下摄像头
  8. 计算机专业开学要带电脑吗,大学新生刚开学需要带电脑吗
  9. 吸收塔如何提高吸收率_缺钙了该如何补钙?饮食补钙更健康
  10. opencv绘制基本形状的二值图像
  11. 计算入瞳、出瞳位置及孔径大小
  12. 冰点还原容易出现的问题总结
  13. 【JS 逆向百例】某音 X-Bogus 逆向分析,JSVMP 纯算法还原
  14. IBM沃森Watson答题过程全揭秘
  15. 安装SqlServer 2008 R2时出现程序兼容性问题
  16. win10电脑蓝屏自动修复失败无法开机的解决
  17. 在Python中画炫酷的K线图
  18. linux du命令 前多少个,Linux du命令查看文件夹大小并按降序排列
  19. 立足信息时代起点 探索企业营销新模式
  20. 教大家如何把pdf转成dwg格式的cad文档

热门文章

  1. Vue.js 上传文件(后台使用.net)
  2. 计算机二级是报office还是vb,请问一下计算机二级中,高阶office好考,还是VB好考?...
  3. 文本加密算法matlab,matlab希尔加密算法
  4. 嘿,老李,又在写BUG呢?
  5. 死磕算法!35 篇算法设计实例+6 本超赞好书打包送你
  6. 未来已来!分布式数据库的“星辰大海”绝不仅限于替换!
  7. 优酷响应式在消费场景的落地之 iOS 篇
  8. 两天,我把分布式事务搞完了!
  9. CSDN 创始人蒋涛:选择长沙作“大本营”,打造开发者中心城市
  10. 震惊!谷歌专家爆料:Python和AI这回真的玩大了!网友:好方法!