PID 与 TID 的区别

PID 和 TID 的区别是什么?

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

68177 次浏览

Pid 和 tid 是相同的,除了在使用 CLONE_THREAD调用 clone创建进程时(按照 gettid的手册页)。在这种情况下,您会得到一个惟一的线程 id,但是属于同一个线程组的所有线程都共享相同的进程 id。

然而,我还记得读到(虽然我找不到源)从 getpid返回的值可能被缓存。

[更新] 有关缓存 pids的影响的讨论,请参阅 NOTES部分 给你

实际上,Linux 进程中的每个线程都是轻量级进程(LWP)。因此,人们可能会把线程称为一个过程... ... 但肯定是有区别的。 进程中的每个线程都有不同的线程 ID (TID)并共享相同的进程 ID (PID)。

如果您使用的是 pthread 库函数,那么这些函数不会使用这些 TID,因为它们是内核/OS 级别的线程 ID。

这很复杂: Pid是进程ID,Tid是线程标识符。

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

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

但是为了让事情更有趣,当一个进程只有一个线程(最初的情况和在美好的旧时代只有一个线程)时,PidTid总是相同的。因此,任何使用 Tid的函数都将自动使用 Pid

值得注意的是,许多使用 Pid的函数/系统调用/命令行实用程序实际上都使用 潮汐。但是如果效果是全过程的,你就不会注意到差异。

根据 man gettid的数据,再补充一下其他的答案:

此调用返回的线程 ID 与 POSIX 线程 ID (即 pthread _ self (3)返回的不透明值)不同。

所以 TID 有两种不同的含义!