pthread_self()和gettid()之间有什么区别? 我应该使用哪一个?

我试图在Linux上设置线程的CPU亲和力。 我想知道以下哪种方法是推荐的:

  1. 使用pthread_self()获取线程ID

    使用pthread_setaffinity_np(….)通过将线程ID作为参数来设置CPU关联

  2. 使用gettid()调用获取线程ID

    使用sched_setaffinity(….)通过将线程ID传递给进程ID的位置来设置CPU关联

PS:在设置CPU亲和力之后,我打算增加线程的调度优先级。

Solutions Collecting From Web of "pthread_self()和gettid()之间有什么区别? 我应该使用哪一个?"

他们不一样 。 以下是我从TLPI收集的一些数据 (我找不到足够大的数据块来完整描述这一点)。 如果你匆忙,你可能只需要最后一部分。

gettid

Linux 2.4引入了一个新的系统调用gettid() ,允许线程获取自己的线程ID。

线程组中的每个线程都由一个唯一的线程标识符来区分。 线程ID使用与进程ID pid_t相同的数据类型表示。 线程ID是系统范围内唯一的,并且内核保证没有线程ID将与系统上的任何进程ID相同,除非线程是进程的线程组领导者。

pthread_self

进程中的每个线程都由一个线程ID唯一标识。 线程可以使用pthread_self()来获取自己的ID。

因为pthread_t数据类型必须被视为不透明数据,所以需要使用pthread_equal()函数来比较线程ID。

在Linux线程实现中,线程ID在进程间是唯一的。 但是,在其他实现中并不一定如此, SUSv3明确指出应用程序不能使用线程ID来标识另一个进程中的线程

gettid vs pthread_self

POSIX线程ID与特定于Linux的gettid()系统调用返回的线程ID不同。 线程实现为POSIX线程ID分配和维护。 由gettid()返回的线程ID是内核分配的一个数字(类似于进程ID)。

我会去与pthread_setaffinity_np但请注意,该手册说:

这些函数在sched_setaffinity(2)之上实现,

我相信, gettid()只存在于系统调用中,并没有直接作为API调用暴露,这意味着“只有在您完全确定自己在做什么时才使用它”, gettid()不是意味着便携。

你应该更好,如果你坚持pthread 。 稍后可以使用pthread_setschedparam()更改调度策略/优先级