在Linux上,线程由pthread_t
或TID标识。我正在寻找这两种线程ID之间的桥梁:
pthread_t
我能得到它TID
吗? apparently并非没有攻击pthread的内部人员:(但我还是会问,以防有人干净利落。TID
(或PID
),我可以获得pthread_t
句柄吗?因为术语"线程ID"在这种背景下(以及在文档中),有点背景:
POSIX pthread API定义了pthread_t
类型,查询/操作线程的所有函数都使用pthread_t
参数,我们可以获得这样的句柄,例如与pthread_self()
。文档调用这些"线程ID",但在这里我称它们为句柄以消除歧义,因为多个不同的pthread_t
值可能代表相同的线程,因此需要pthread_equal(pthread_t, pthread_t)
。
另一方面,至少在linux上,有TID
s或线程ID的概念。可以通过系统调用获取当前TID
:syscall(SYS_gettid)
。 TID
有一些有趣的属性,例如对于一个线程是唯一的,并且与PID
相当,它允许轻松识别主线程等。
答案 0 :(得分:3)
不幸的是,由于there is no requirement for pthread_t
to map to tid
:
实现可以选择将线程ID定义为结构。与使用int相比,这允许更多的灵活性和健壮性。例如,线程ID可以包括允许检测“悬空ID”的序列号(已经分离的线程ID的副本)。由于C语言不支持对结构类型进行比较,因此提供了pthread_equal()函数来比较线程ID。
从历史上看,在NPTL之前,pthread_t
未将1对1映射到tid
。
您需要使用pthreads库实现详细信息来查看tid
。我不建议这样做,因为这样的代码不可移植。
仅为了好奇,使用glibc,pthread_t
is a struct pthread *
:
27 int
28 __pthread_kill (pthread_t threadid, int signo)
29 {
30 struct pthread *pd = (struct pthread *) threadid;
...
40 pid_t tid = atomic_forced_read (pd->tid);
122 /* Thread descriptor data structure. */
123 struct pthread
124 {
...
166 /* Thread ID - which is also a 'is this thread descriptor (and
167 therefore stack) used' flag. */
168 pid_t tid;