linux 线程tid,关于linux:PID和TID之间的区别

PID和TID有什么区别?

标准答案是PID用于进程,而TID用于线程。 但是,我已经看到一些命令可以互换使用。 例如,htop有一列用于PID的列,其中显示了同一进程的线程的PID(具有不同的值)。 那么,PID何时表示线程或进程?

您可以更改htop设置以查看其他颜色的进程和线程。 它还有助于使用树视图。

这很复杂:pid是进程标识符; tid是线程标识符。

但是碰巧的是,内核并没有真正区分它们:线程就像进程一样,但是它们与同一组的其他实例共享某些东西(内存,fds ...)。

因此,tid实际上是内核(线程)中可调度对象的标识符,而pid是共享内存和fds(进程)的可调度对象组的标识符。

但是让事情变得更有趣的是,当一个进程只有一个线程(初始情况,在过去的好时光只有一个线程)时,pid和tid总是相同的。因此,任何与tid一起使用的功能都将自动与pid一起使用。

值得注意的是,许多与pid一起使用的函数/系统调用/命令行实用工具实际上都使用了tid。但是,如果影响是全过程的,您将根本不会注意到差异。

更有趣的是:源中也出现了名称tgid(线程组标识符),您已经可以猜到它与pid是同义词。

gettid()的tid与pthread_t tid不同,请参见man gettid

在此答案中使用的" fds"是什么意思?

@Stephen fds代表文件描述符,即代表打开的文件,套接字或类似对象的那些小整数。

实际上,Linux进程中的每个线程都是轻量级进程(LWP)。因此,人们可能将线程称为进程。但是肯定会有区别。

进程中的每个线程都有不同的线程ID(TID),并且共享相同的进程ID(PID)。

如果您正在使用pthread库函数,则这些函数将不使用这些TID,因为它们是内核/ OS级线程ID。

根据man gettid,仅用于添加其他答案:

The thread ID returned by this call is not the same thing as a POSIX thread ID (i.e., the opaque value returned by pthread_self(3)).

因此,TID可能意味着两种不同的含义!

pid和tid相同,除了使用CLONE_THREAD(根据gettid的手册页)调用clone创建进程时。在这种情况下,您将获得唯一的线程ID,但是属于同一线程组的所有线程共享相同的进程ID。

但是,我还记得(尽管找不到源)阅读了从getpid返回的值可能被缓存的情况。

[更新]

有关缓存pids的影响的讨论,请参见此处的NOTES部分。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值