有没有办法链接Linux的线程TID和pthread_t"线程ID"

时间:2017-01-06 17:53:45

标签: linux pthreads pid

在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的概念。可以通过系统调用获取当前TIDsyscall(SYS_gettid)TID有一些有趣的属性,例如对于一个线程是唯一的,并且与PID相当,它允许轻松识别主线程等。

1 个答案:

答案 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);

pthread is

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;