8

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

在此先感谢您的帮助!

4

5 回答 5

11

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


1. 需要注意的是,如果使用 PID 命名空间,则 TID 和 PID 仅在同一 PID 命名空间内是唯一的。

于 2013-01-03T10:52:37.397 回答
9

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

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

于 2013-01-02T16:44:42.120 回答
2

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

于 2013-01-02T17:48:12.483 回答
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()在多进程环境中用于识别线程,则可能会发生冲突,尽管可能性很小。

于 2013-05-30T13:23:05.440 回答
0
pthread_equal(id1,id2)

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

于 2014-05-19T18:22:18.687 回答