线程ID和进程ID之间的关系

neo*_*neo 6 c linux multithreading

我在进程ID和线程ID之间有一些混淆.我已经通过几个网页后消失了,包括堆栈溢出这里,它说

启动一个新进程会为您提供一个新的PID和一个新的TGID,而启动一个新的线程会在保持相同的TGID的同时为您提供一个新的PID.

所以当我运行程序时为什么从程序创建的所有线程都没有不同的PID?

我知道在编程中我们通常会说main是一个线程,执行从main开始,所以如果我从main创建多个线程,所有线程将具有相同的PID,它等于main的PID.

所以我想问的是如下:

1)当我们运行程序时,它将作为进程或线程运行?

2)线程创建线程和进程创建线程之间有什么区别吗?

3)linux中的线程和进程有什么区别吗?因为我读到某个地方,linux没有区分线程和进程.

Der*_*unk 10

简化一下:

  1. PID是进程ID,TID是线程ID.问题是,对于创建的第一个线程fork(),PID = TID.如果在进程中使用clone()命令创建更多线程,则PID和TID将不同,PID将始终小于TID.

  2. 不,没有区别,除非主要被杀,所有其他线程也被杀死.

  3. 是的,线程是实际安排的.从技术上讲,该过程只是不同代码段(文本,bss,堆栈,堆和OS)的内存映射.

  • 要扩展你的3.一个进程*存在*,一个线程*做*. (4认同)

Ser*_* L. 6

这种混乱来自Linux 的任务概念。

但在 Linux 中,任务和线程之间几乎没有区别。

每个进程都是一个独立的虚拟机,运行至少一个任务。

每个任务都是流程范围内的一个独立的执行单元。

进程的主要任务将其任务 ID (TID) 提供给该进程,就像它的进程 ID (PID) 一样。

您在进程中生成的每个新线程都会在其中创建一个新任务。为了在内核中单独识别,它们被分配了自己的单独任务 ID (TID)。

进程内的所有任务共享相同的任务组 ID (TGID)。


neo*_*neo 2

我在 stackoverflow上得到了答案。它指出,如果我们在 Linux 上运行包含 libc libuClibc-0.9.30.1.so (1) 的程序。基本上,旧版本的 libc 然后创建的线程将具有不同的 PID,如下所示

root@OpenWrt:~# ./test
main thread pid is 1151
child thread pid is 1153
Run Code Online (Sandbox Code Playgroud)

我尝试使用包含来自 ubuntu libc6 (2) 的 libc 的 Linux 运行该程序,即较新版本的 libc,然后创建的线程将具有与进程相同的 PID。

$ ./test
main thread pid is 2609
child thread pid is 2609
The libc (1) use linuxthreads implementation of pthread
Run Code Online (Sandbox Code Playgroud)

而libc(2)使用NPTL(“Native posix thread library”)实现pthread

根据linuxthreads常见问题解答(J.3 答案):

每个线程实际上是一个具有不同 PID 的不同进程,发送到线程 PID 的信号只能由该线程处理

所以在旧的libcwhich uselinuxthreads实现中,每个线程都有其不同的 PID

在使用实现的新libc版本中NPTL,所有线程都具有相同的主进程PID。

NPTL是由redhat团队开发的。根据redhat NPTL文档:NPTL实现中解决的问题之一是:

(Chapter: Problems with the Existing Implementation, page5)
Run Code Online (Sandbox Code Playgroud)

Each thread having a different process ID causes compatibility problems with other POSIX thread implementations. This is in part a moot point since signals can't be used very well but is still noticeable

这就解释了这个问题。

我正在使用新的 libc 版本,其中包含NPTLpthread 的(“本机 posix 线程库”)实现。