multithreading进程的线程ID是否可以与其他正在运行的进程的进程ID相同?

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

先谢谢您的帮助!

Solutions Collecting From Web of "multithreading进程的线程ID是否可以与其他正在运行的进程的进程ID相同?"

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

根据pthreads的手册页,线程ID在创建过程中是唯一的,所以是另一个线程或进程可以有相同的ID。 但是,如果在进程中它是唯一的,并且进程ID在系统中是唯一的,那么也许可以使用这两者的组合作为唯一标识符。

进程中的每个线程都有唯一的线程标识符(存储在类型pthread_t中)。 这个标识符被返回给pthread_create(3)的调用者,并且一个线程可以使用pthread_self(3)获得它自己的线程标识符。 线程ID只能保证在进程中是唯一的。

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

那么,我刚刚遇到同样的问题,这是我的验证程序。

 #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()来标识多进程环境中的线程,则可能会发生冲突,尽管这是一个小的机会。

 pthread_equal(id1,id2) 

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