目录

一.内核层面:pid & tgid

二.函数调用层面:getpid & gettid & pthread_self

三.用户层面:PID & LWP(TID)

四.总结


一.内核层面:pid & tgid

首先,我们要清楚,在系统层面只有两个编号:pidtgid

不妨拿出task_struct结构体(进程PCB)看一看:

pid_t pid;
pid_t tgid;  

我们知道,在linux中进程和线程都使用task_struct结构体实现。

在task_struct中:

pid即线程id。也就是task_struct的编号,每个task_struct各不相同。

tgid叫线程组id。也就是一个进程的id。同一个进程里每一个线程的task_struct中tgid值都一样。

二.函数调用层面:getpid & gettid & pthread_self

直接说结论:

getpid获得的是task_struct中的tgid,即线程组编号。

gettid获得的是task_struct中的pid,即线程编号。(也就是LWP/TID

pthread_self获得的是线程在共享区数据的起始地址。

因此,在多线程中,使用getpid获取的全都相同,gettid获取的各不相同。

getpid和gettid是系统接口,获得的是内核数据;而pthread_self是库函数,获得的是用户级数据。

画图表示如下:

值得一提的是,编程时gettid不能直接使用,需要自定义封装才行:

pid_t gettid(){return static_cast<pid_t>(syscall(SYS_gettid));
}

三.用户层面:PID & LWP(TID)

当使用ps axj或ps -aL查看进程或线程时,显示的PID即线程组编号,也就是task_struct中的tgidLWP即线程编号,也就是task_struct中的pid

可以使用如下代码验证:

#include<iostream>
#include<unistd.h>
#include<pthread.h>
#include<sys/types.h>
#include<sys/syscall.h>
using namespace std;pid_t gettid(){return static_cast<pid_t>(syscall(SYS_gettid));
}void* func(void* arg){cout << pthread_self() << endl;cout << "tgid: " << getpid()<< endl;cout << "pid: " << gettid() << endl;cout << "***********************************************" << endl;sleep(5);
}
int main(){pthread_t tid[2];pthread_create(&tid[0], nullptr, func, nullptr);sleep(2);pthread_create(&tid[1], nullptr, func, nullptr);pthread_join(tid[0], nullptr);pthread_join(tid[1], nullptr);return 0;
}

结果:

四.总结

含义 内核PCB 系统调用 用户显示(ps命令)
线程编号 pid gettid() LWP/TID
线程组编号 tgid getpid() PID

如有错误,敬请斧正

Linux——一文彻底了解进程id和线程id的关系(什么是pid、tgid、lwp、pthread_t)相关推荐

  1. GetWindowThreadProcessId 获得窗口所在进程ID和线程ID

    GetWindowThreadProcessId 获得窗口所在进程ID和线程 在得到窗口句柄后我们可以通过GetWindowThreadProcessId这个函数来获得窗口所属进程ID和线程ID,从而 ...

  2. linux C语言如何获取进程号和线程号?getpid()、syscall(__NR_gettid)

    有些时候,需要在Log中打出进程或线程的ID,以便调试.查找问题. 获取进程ID #include <unistd.h> pid_t getpid(void); 获取线程ID // 方法1 ...

  3. Linux高性能服务器编程:进程池和线程池原理及应用(有图有代码有真相!!!)

    一.问题引入 在前面编写多进程.多线程服务器时通过动态创建子进程和子线程来实现并发服务器,这样做有以下缺点: 1)动态创建进程.线程将会比较耗费时间,将导致较慢的客户响应. 2)动态创建的子进程只为一 ...

  4. ntel Xeon E5-2658的CPU核ID和线程ID的对应关系

    cpu0 核ID 0 1 2 3 4 8 9 10 11 12 线程ID 0 20 1 21 2 22 3 23 4 24 5 25 6 26 7 27 8 28 9 29 cpu1 核ID 0 1 ...

  5. linux进程查看所有线程,Linux中查看进程的多线程的方法

    在SMP系统中,我们的应用程序经常使用多线程的技术,那么在Linux中如何查看某个进程的多个线程呢? 本文介绍3种命令来查看Linux系统中的线程(LWP)的情况: 在我的系统中,用qemu-syst ...

  6. C++线程id(线程号TID)

    文章目录 线程id 由谁分配? 线程id和进程号区别? 线程id 进程 ID 被称为 PID,而线程 ID 被称为 TID. 线程 ID 是操作系统分配给线程的唯一标识符.线程是程序执行的基本单元,线 ...

  7. 【多线程】线程与进程、以及线程进程的调度

    在了解多线程之前,首先要区分线程和进程的概念与区别,我目前只了解到Java的JVM中与操作系统联系中的线程和进程,在了解线程与进程之前,首先要初步了解电脑中的操作系统的地位和作用. 冯诺依曼体系 计算 ...

  8. linux进程号为一,一步步探究linux进程中的用户ID

    转载请注明来源chengyaogen.blog.chinaunix.net 一.进程与权限 A.进程时Linux/Unix操作系统中最重要的抽象之一 B.进程是一个处于执行期的程序(目标代码存储在某种 ...

  9. linux 线程id 进程id,在Linux上显示正在运行的进程的线程ID

    在Linux上显示正在运行的进程的线程ID 在上Linux," ps -T"可以显示正在运行的进程的线程信息: # ps -T 2739 PID SPID TTY STAT TIM ...

最新文章

  1. Solaris 10 x86 上折腾Mono
  2. 文件内存映射mmap解决大文件快速读写问题和进程间共享内存
  3. Nhibernate 三种配置方式
  4. POJ 2724 Purifying Machine (二分图匹配)
  5. 不同网段Linux通过路由表,Linux服务器架设---《路由表配置,实现不同网段不同网卡之间的ping...
  6. 使用TensorFlow.js的AI聊天机器人六:生成莎士比亚独白
  7. 浅谈UWB室内定位(二)
  8. linux centos7 配置ftp,Linux Centos7配置ftp服务器
  9. Java实现Modbus/TCP客户端与modsim通信
  10. java 读取文件成字节数组_java读取文件为字节数组
  11. 得物(毒)app测试开发工程师面经
  12. 【IT项目管理】第4章 控制项目范围
  13. 水中机器人电控方案设计
  14. springMVC学习2
  15. 每周推荐短视频:谈论“元宇宙”要有严肃认真的态度
  16. 谈一谈mmkv的使用
  17. 【俗话编程】什么是对象?
  18. 2017中国(郑州)国际医药保健品及福祉产业交易会会刊(参展商名录)
  19. 微服务 2.0 技术栈选型手册
  20. 设备树学习(十五、番外篇-中断子系统之IRQ Domain介绍)

热门文章

  1. 第九章-项目人力资源管理
  2. 【微信小程序】解决点击(bindtap)和长按(bindlongtap)冲突
  3. 连接查询--嵌套查询
  4. ajax提交多个form表单
  5. CAD图纸打印文字显示空心怎么办?
  6. (数论一)积性函数与狄利克雷卷积
  7. Linux - 新建用户教程(新增一个具有root权限的新用户)
  8. 省市区json格式数据及异步请求json数据
  9. 垂直搜索引擎的存在意义
  10. 数值计算之 插值法(1)多项式插值——拉格朗日插值法