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

时间:2011-06-16 12:49:47

标签: linux pthreads affinity

我正在尝试在Linux上设置线程的CPU亲和性。我想知道建议采用以下哪种方法:

  1.   

    使用pthread_self()

    获取线程ID      

    通过将线程id作为参数传递,使用pthread_setaffinity_np(....)设置CPU关联性

  2.   

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

         

    通过在进程ID的位置传递线程ID,使用sched_setaffinity(....)设置CPU关联性

  3. P.S:设置CPU亲和性后,我打算增加线程的调度优先级。

2 个答案:

答案 0 :(得分:19)

他们不一样。以下是我从 TLPI 收集的一些内容(我找不到足够大的块来完全描述这一点)。如果你赶时间,你可能只想要最后一部分。

gettid

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

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

pthread_self

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

比较线程ID需要pthread_equal()函数,因为必须将pthread_t数据类型视为不透明数据

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

gettid vs pthread_self

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

我会选择pthread_setaffinity_np,但要注意手册上写着:

  

这些功能在顶部实现   sched_setaffinity(2)

答案 1 :(得分:0)

我认为gettid()仅作为系统调用存在并且未直接作为API调用公开的事实可能意味着“只有在您完全确定自己在做什么时才使用它”并且gettid()并不意味着便携。

如果坚持pthread,你应该会更好。您可以稍后使用pthread_setschedparam()

更改计划策略/优先级