关于线程号的一些总结

本文介绍了如何获取线程号,包括pthread_self()和gettid()两种方法,前者仅在进程内有效,后者在系统内唯一。还讲述了如何通过命令行查看进程的所有线程,以及如何获取系统内的所有线程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于本人才疏学浅,本文难免存在遗漏之处,欢迎大家留言指正,本人将感激不尽。 强调内容

一、线程号的获取

首先,我们要知道一个进程可能包含多个线程,每个线程都有自己的id。获取线程id存在下面两种方法:

1、pthread_t pthread_self(void):
 其中返回值类型为pthread_t,类型的定义如下所示:

typedef unsigned long int pthread_t

  注意,pthread_self获取的线程id只是在该线程所属的进程内有用,进程内部可以通过pthread_self获取的id来区分线程,并且在不同进程内的线程可能存在相同的由pthread_self所获取的id,系统无法用此id来区分线程。

2、pid_t gettid(void):
  返回类型为pid_t,实际上pid_t为int类型。 
  在Linux中进程id类型也为pid_t,所以我们可以看到,在linux 中线程其实是通过进程来实现的。
  通过gettid()获取的id在整个系统内都是可见的,每个线程都具有独一无二的由gettid获取的id。

gettid用法举例

#include <sys/syscall.h>
printf("%d %d\n", getpid(), syscall(SYS_gettid)); //通过系统调用使用
二、命令行查看某个进程的所有线程
bash> ps -p 105357 -T
   PID   SPID TTY          TIME CMD
105357 105357 pts/18   00:00:00 ta
105357 105358 pts/18   00:00:00 ta

  此处获取进程105357的所有线程,可以看到该进程有两个线程,105357和105358,其中105357为主线程。

三、获取系统内的所有线程
bash> ps -Lef | grep 105357
UID         PID   PPID    LWP  C NLWP STIME TTY
wen      105357  98076 105357  0    2 13:47 pts/18   00:00:00 ./ta
wen      105357  98076 105358  0    2 13:47 pts/18   00:00:00 ./ta
wen      105412 104637 105412  0    1 13:51 pts/19   00:00:00 grep --color=auto 105357

可通过命令ps -Lef获取所有线程,其中列LWP(轻量级进程)即为线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值