pthread_self()和gettid()返回的值之间的差异

时间:2013-05-17 13:29:41

标签: c linux multithreading multiprocessing

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

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

我的理解是否正确?

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

3 个答案:

答案 0 :(得分:2)

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

  1. gettid()返回与内核进程调度程序中的线程条目相对应的值(非常类似于getpid()。这是调度优先级和亲和力可以设定的事情。

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

gettid()返回(特定于pthread实现)系统范围的唯一thread-id(在Linux上)。


  

gettid()返回的TID(线程ID)在进程

中是唯一的

  

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

  

在进程内部,不同的线程具有不同的线程ID。

  

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

没有

  

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

在同一过程中是的,整个机器都没有。


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