该引用来自man page of pthread_self()。
那么,我应该在什么基础上决定是否应该使用pthread_self
或gettid
来确定哪个线程正在运行该功能? < / p>
两者都不便携 为什么有两个不同的函数来获取线程ID?
答案 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_t
在pthread
包支持的抽象中只有 ,而pid_t
在包含此类型的抽象中是有意义的(即Linux系统调用)在pid_t
)处理。
您应该根据上下文使用正确的类型。在需要pthread_t
的上下文中需要类型pthread_t
和pid_t
的上下文中使用pid_t
- 无论它们是否可能引用相同的线程。
这些背景中的每一个都规定了比较和平等的语法。 pid_t
运算符可以直接比较==
,而必须通过调用pthread_t
来比较pthread_equal
。
这种双重表示/软件抽象的原因是pthread
库是可以在不同操作系统上实现的可移植线程库。 pthread
库的不同实现可确保thread id
类型始终为pthread_t
。这些线程可能会映射到特定于操作系统thread entity
的操作系统,其操作系统标识符取决于操作系统(例如,对于Linux,它是pid_t
;对于Windows,它是DWORD
。
因此,虽然底层实现可能因操作系统而异,但针对pthread
抽象编写的代码仍然可以跨操作系统移植(只要您将自己局限于pthread
抽象)。