我正在尝试找到一种在多进程环境中唯一标识线程的方法。我有一个服务器来跟踪连接到它的不同进程,其中一些是多线程的,而另一些不是。为了从多线程连接中识别线程,我使用线程 ID 作为唯一标识符(在任何给定时间最多连接 1 个多线程进程)。我的问题是:这些线程之一的线程 ID 是否可能与系统上运行的另一个进程的进程 ID 相同?
在此先感谢您的帮助!
我正在尝试找到一种在多进程环境中唯一标识线程的方法。我有一个服务器来跟踪连接到它的不同进程,其中一些是多线程的,而另一些不是。为了从多线程连接中识别线程,我使用线程 ID 作为唯一标识符(在任何给定时间最多连接 1 个多线程进程)。我的问题是:这些线程之一的线程 ID 是否可能与系统上运行的另一个进程的进程 ID 相同?
在此先感谢您的帮助!
TID(由系统调用返回)在系统1sys_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,如果它们不同则返回非零数。