如何获取进程的线程id?------说说gettid与pthread_self的区别

2024-02-06 10:48

本文主要是介绍如何获取进程的线程id?------说说gettid与pthread_self的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       一切源于需求,需要用到,所以来说说。

 

       之前一直用pthread_self来获取线程id, 这个id通常臭大臭大的。让我纳闷的是,翻遍了所有资料,没有办法通过linux命令来获取线程id, 我不信这个邪。

       当然, 我也查到了, 可以用 ps -Tp pid或者top -Hp pid的方式来获取线程id,  我用了这两个命令,但获取不到如上的线程id. 后来我才明白, 这两个命令确实可以获取到线程id,  但不是上述那个臭大臭大的id, 其实, 这就涉及到gettid与pthread_self的区别了。

       gettid获取的是内核中的真实线程id,  而pthread_self获取的是posix线程id, 不一样的。上述命令获取的线程id与gettid对应, 跟pthread_self没有毛关系。

       pthread_self不说了, 来看看gettid:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/syscall.h>
#define gettid() syscall(SYS_gettid)
#include <pthread.h>void* threadFunc(void* p)
{printf("threadFunc is %d\n",  gettid());int i = 0;while (1){sleep(1);}return NULL;}int main ()
{printf("main thread id is %d\n", gettid());pthread_t id;pthread_create (&id, NULL, threadFunc, NULL);pthread_create (&id, NULL, threadFunc, NULL);pthread_create (&id, NULL, threadFunc, NULL);pthread_create (&id, NULL, threadFunc, NULL);pthread_create (&id, NULL, threadFunc, NULL);pthread_create (&id, NULL, threadFunc, NULL);int i = 0;while (1){sleep(1);}return 0;
}

         编译:g++ test.cpp -lpthread

         运行起来, 然后查看一下:

ubuntu@VM-0-15-ubuntu:~$ ps -aux |grep a.out
ubuntu   26810  0.0  0.0  55692   696 pts/3    Sl+  20:12   0:00 ./a.out
ubuntu   26908  0.0  0.1  13228   972 pts/4    S+   20:13   0:00 grep a.out
ubuntu@VM-0-15-ubuntu:~$ 
ubuntu@VM-0-15-ubuntu:~$ ps -Tp 26810PID  SPID TTY          TIME CMD
26810 26810 pts/3    00:00:00 a.out
26810 26811 pts/3    00:00:00 a.out
26810 26812 pts/3    00:00:00 a.out
26810 26813 pts/3    00:00:00 a.out
26810 26814 pts/3    00:00:00 a.out
26810 26815 pts/3    00:00:00 a.out
26810 26816 pts/3    00:00:00 a.out
ubuntu@VM-0-15-ubuntu:~$ 

       看到没: 主线程 + 6个子线程。 第二列就是线程id.  进程id和主线程id是相等的。

 

       看到这里, 有个疑问, 快速启动多个a.out进程, 如果进程id紧紧挨在一起, 那么线程id是不是就重叠了呢?

       我快速开启4个a.out进程, 来看看:

ubuntu@VM-0-15-ubuntu:~$ ps -aux | grep a.out 
ubuntu   27224  0.0  0.0  55692   752 pts/6    Sl+  20:18   0:00 ./a.out
ubuntu   27232  0.0  0.0  55692   700 pts/5    Sl+  20:18   0:00 ./a.out
ubuntu   27239  0.0  0.0  55692   692 pts/4    Sl+  20:18   0:00 ./a.out
ubuntu   27247  0.0  0.0  55692   692 pts/3    Sl+  20:18   0:00 ./a.out

         可以看到, 进程id并没有紧挨在一起, 给线程id留了空隙, 有点意思。

 

         最后思考一个问题:进程的线程id一定是如上所示的连续的吗?

         当然不一定!

 

      

这篇关于如何获取进程的线程id?------说说gettid与pthread_self的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/684071

相关文章

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

什么是 Ubuntu LTS?Ubuntu LTS和普通版本区别对比

《什么是UbuntuLTS?UbuntuLTS和普通版本区别对比》UbuntuLTS是Ubuntu操作系统的一个特殊版本,旨在提供更长时间的支持和稳定性,与常规的Ubuntu版本相比,LTS版... 如果你正打算安装 Ubuntu 系统,可能会被「LTS 版本」和「普通版本」给搞得一头雾水吧?尤其是对于刚入

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)

python中json.dumps和json.dump区别

《python中json.dumps和json.dump区别》json.dumps将Python对象序列化为JSON字符串,json.dump直接将Python对象序列化写入文件,本文就来介绍一下两个... 目录1、json.dumps和json.dump的区别2、使用 json.dumps() 然后写入文

C#如何优雅地取消进程的执行之Cancellation详解

《C#如何优雅地取消进程的执行之Cancellation详解》本文介绍了.NET框架中的取消协作模型,包括CancellationToken的使用、取消请求的发送和接收、以及如何处理取消事件... 目录概述与取消线程相关的类型代码举例操作取消vs对象取消监听并响应取消请求轮询监听通过回调注册进行监听使用Wa

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级