多线程进程的线程ID是否可以与另一个正在运行的进程的进程ID相同?

时间:2013-01-02 16:35:43

标签: linux multithreading process linux-kernel pthreads

我正在尝试找到一种在多进程环境中唯一标识线程的方法。我有一个服务器跟踪连接到它的不同进程,其中一些是多线程的,而其中一些不是。要从多线程连接中识别线程,我使用线程ID作为唯一标识符(在任何给定时间最多连接1个多线程进程)。我的问题是:这些线程之一的线程ID是否可能与系统上运行的另一个进程的进程ID相同?

提前感谢您的帮助!

5 个答案:

答案 0 :(得分:9)

根据man page of pthreads,线程ID在创建过程中是唯一的,因此是另一个线程或进程可以具有相同的ID。但是,如果它在一个进程中是唯一的,并且进程ID在系统中是唯一的,那么您可以使用这两者的组合作为唯一标识符。

  

进程中的每个线程都有唯一的线程标识符   (存储在pthread_t类型中)。此标识符将返回给   pthread_create(3)的调用者,一个线程可以获得自己的线程   使用pthread_self(3)的标识符。 仅保证线程ID   在过程中是独一无二的。

答案 1 :(得分:8)

TID(由sys_gettid()系统调用返回)在系统 1 上的所有线程中是唯一的,对于单线程进程,PID和TID是相等的。这意味着TID永远不会与来自另一个进程的PID冲突。

<小时/> 1。需要注意的是,如果正在使用PID名称空间,则TID和PID仅在同一PID名称空间内是唯一的。

答案 2 :(得分:2)

虽然pthread ID可能不是唯一的,但在线程映射到任务的实现中,任务ID(如/ proc / PID / task中所示)实际上是系统范围内唯一的,并且具有类似于实际的PID。

答案 3 :(得分:0)

好吧,我刚才遇到了同样的问题,这是我的验证程序。

#include <pthread.h>
#include <stdio.h>

int main() {
    printf("%lu\n", pthread_self());
}

clang -pthread test.c && strace ./a.out

部分输出如下。

...
arch_prctl(ARCH_SET_FS, 0x7f53259be740) = 0
...
write(1, "139995089987392\n", 16139995089987392
)       = 16
...

然后我们知道 0x7f53259be740 等于 139995089987392 arch_prctl的第二个参数应该在进程地址空间(man arch_prctl)。也就是说,线程ID实际上是虚拟地址。因此,如果您使用pthread_self()来识别多进程环境中的线程,则可能会发生冲突,但机会很小。

答案 4 :(得分:0)

pthread_equal(id1,id2)

它将比较两个线程的ID,如果它们相同则返回0,如果它们不同则返回非零数字。