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