根据我的理解,TID
返回的gettid()
(线程ID)在进程内是唯一的(或者在具有多个进程的程序内,而每个进程可能有多个线程),即在进程内部,不同的线程有不同的线程ID。
TID
返回的pthread_self()
在进程间是唯一的,即在同一台机器上,不同的线程同时在同一台机器上有不同的TID
。
我的理解是否正确?
此外,线程如何获得其派生线程的TID
(对应gettid()
)?
谢谢!
答案 0 :(得分:2)
在Linux上为这个问题添加一些实现上下文:
gettid()返回与内核进程调度程序中的线程条目相对应的值(非常类似于getpid()。这是调度优先级和亲和力可以设定的事情。
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。