【问题标题】:difference between the value returned by pthread_self() and gettid()pthread_self() 和 gettid() 返回的值之间的差异
【发布时间】:2026-02-13 21:25:04
【问题描述】:

据我了解,gettid()返回的TID(thread id)在一个进程内是唯一的(或者在一个有多个进程的程序内,而每个进程可能有多个线程),即在一个进程内,不同的线程有不同的线程ID。

pthread_self()返回的TID在进程间是唯一的,即在同一台机器上,不同线程在同一台机器上同时拥有不同的TID

我的理解是否正确?

此外,线程如何获得其派生线程的TID(对应于gettid())? 谢谢!

【问题讨论】:

标签: c linux multithreading multiprocessing


【解决方案1】:

在 Linux 上为这个问题添加一些实现上下文:

  1. gettid() 返回与内核进程调度程序中线程条目相对应的值(与 getpid() 所认为的非常相似)。这是可以设置调度优先级和关联性的东西。

  2. pthread_self() 返回指向进程内存映射中调用线程的 TLS(线程本地存储)槽附近的指针。显然,根据 TLS 的定义,这个值在给定进程中是唯一的(并且可以映射到内核 TID 并返回),但它不可能在系统范围内是唯一的,因为每个进程都有相同的虚拟地址范围。

【讨论】:

  • 请注意,在 Linux 上,gettid() 与 unix 工具“top”、“htop”、“pidstat -t”和“ps -ef”报告的值相同。这有助于开发人员将麻烦的进程与特定线程相关联。 “pidstat -t”工具将有助于识别过多的线程上下文切换。
【解决方案2】:

在我的观察中 pthread_self() 在进程中不是唯一的。 它在任何特定时刻都是独一无二的。 但是当线程终止并在进程运行时启动其他线程时, 它们可能会重用其他线程之前已经使用过的 pthread_self() 值。

【讨论】:

  • "...观察pthread_self 在进程中不是唯一的" - 正确。它记录在pthread_self(3):“在终止的线程加入或分离的线程终止后,可以重用线程ID”。
【解决方案3】:

pthread_self() 返回进程范围的唯一 pthread-id。

gettid() 返回(特定于 pthread 实现的)系统范围的唯一线程 ID(在 Linux 上)。


gettid() 返回的 TID(thread id) 在进程内是唯一的

是的。

(或在具有多个进程的程序中,

是的。

在一个进程中,不同的线程有不同的线程id。

是的。

pthread_self() 返回的 TID 在进程间是唯一的,

没有。

不同线程同时在同一台机器上有不同的TID。

在同一进程中是,在整个机器上都没有。


由于gettid() 是 Linux 特定的,因此不可移植,因此系统广泛识别 pthread 的唯一方法是使用由 getpid() 返回的其(系统范围唯一)父进程 ID 及其(进程范围唯一) pthread-id 由pthread_self() 返回。

【讨论】:

  • 这个我知道,只是我想知道更多细节,这些在我的问题中
  • @misteryes:我的回答中没有什么,你想知道什么?
  • 我的理解是否正确?线程如何获取其派生线程的 TID(对应 gettid())?
  • 在我看来gettid()会占用很多进程id。如果为线程分配了gettid() 的值,则该值在线程的活动时间内不能被其他进程使用。对吗?
  • 对不起,最后一个问题。由于 pthread_t 的结构是不透明的,如果 pthread_t 不是原子类型,例如,它是一个结构,那么赋值运算符是错误的吗?它应该使用指针吗? pthread_t pthread_self(void);
最近更新 更多