PID和TID之间的区别

PID和TID有什么区别?

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

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

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

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

但是让事情变得更有趣的是,当一个进程只有一个线程时(初始状态和唯一的旧时代), pidtid总是一样的。 所以任何使用tid的函数都会自动与pid一起工作。

值得注意的是许多函数/系统调用/命令行实用程序logging与pid一起使用实际上使用tid 。 但是,如果效果是stream程范围的,你根本就不会注意到这种差异。

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

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

只要补充其他答案,根据man gettid

这个调用返回的线程ID与POSIX线程ID不同(即pthread_self(3)返回的opaque值)。

所以TID有两个不同的意思!

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

不过,我还记得阅读(虽然我不能find源),从getpid返回的值可能被caching。

[更新]请参阅这里的NOTES部分关于cachingpids的影响的讨论。