pthread_self()返回的线程ID与调用gettid(2)返回的内核线程ID不同

时间:2015-12-19 11:28:24

标签: c linux multithreading pthreads

该引用来自man page of pthread_self()

那么,我应该在什么基础上决定是否应该使用pthread_selfgettid来确定哪个线程正在运行该功能? < / p>

两者都不便携 为什么有两个不同的函数来获取线程ID?

3 个答案:

答案 0 :(得分:13)

  

那么,我应该在什么基础上决定是否应该使用pthread_self或   gettid来确定哪个线程正在运行该函数?

只要您想在应用程序中识别线程,就应始终使用pthread_self()gettid() 可以 用于某些目的,如果您知道它是Linux。例如,gettid()可用于获取特定于线程的种子的种子(在srand()中使用)。

  

两者都不便携。

这不完全正确。 gettid()不可移植,因为它是Linux特有的功能。但只要您不对其表示做任何假设,pthread_self()就是可移植的。

例如,以下是可移植。

printf("Thread ID is: %ld", (long) pthread_self());

因为不能保证pthread_self()将是某种整数。但是

pthread_t my_tid; //filled elsewhere

pthread_t tid = pthread_self();

if( pthread_equal(my_tid, tid) ) {
   /* do stuff */
}

完全可移植。

前者不可移植,因为它假设该线程id是一个整数,而后者则不是。

  

为什么有两个不同的函数来获取线程ID?

它们不是获得相同价值的两种不同方式。一个(pthread_self()由线程库(pthreads)提供,而另一个(gettid()是特定于OS的函数。不同的OS可以提供​​不同的接口/系统调用以获得类似于{{的线程ID 1}}。所以你不能在便携式应用程序中依赖gettid()

答案 1 :(得分:6)

pthread_self() returns the process-wide unique pthread-id.

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

the TID(thread id) returned by gettid() is unique inside a process

(or inside a program with multiple processes,

inside a process, different thread has different thread id.

the TID returned by pthread_self() is unique across processes,

没有

different thread has different TID on the same machine at the same time.

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

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

答案 2 :(得分:3)

这是一项关于概念术语与真实软件实体(属于特定软件抽象)之间差异的有趣研究。

首先,请注意这两个电话的类型

pid_t gettid(void);
pthread_t pthread_self(void);

一个是pid_t,另一个是pthread_t。这两个都指的是一个名为thread的共同概念实体,但不同的类型意味着它们是两个不同的software entities。它们是thread id的不同表示,并且在包含它的软件抽象中有意义。因此,pthread_tpthread包支持的抽象中只有 ,而pid_t在包含此类型的抽象中是有意义的(即Linux系统调用)在pid_t)处理。

您应该根据上下文使用正确的类型。在需要pthread_t的上下文中需要类型pthread_tpid_t的上下文中使用pid_t - 无论它们是否可能引用相同的线程。

这些背景中的每一个都规定了比较和平等的语法。 pid_t运算符可以直接比较==,而必须通过调用pthread_t来比较pthread_equal

这种双重表示/软件抽象的原因是pthread库是可以在不同操作系统上实现的可移植线程库。 pthread库的不同实现可确​​保thread id类型始终为pthread_t。这些线程可能会映射到特定于操作系统thread entity的操作系统,其操作系统标识符取决于操作系统(例如,对于Linux,它是pid_t;对于Windows,它是DWORD

因此,虽然底层实现可能因操作系统而异,但针对pthread抽象编写的代码仍然可以跨操作系统移植(只要您将自己局限于pthread抽象)。