我正在尝试在Linux上设置线程的CPU亲和性。我想知道建议采用以下哪种方法:
使用pthread_self()
获取线程ID通过将线程id作为参数传递,使用pthread_setaffinity_np(....)设置CPU关联性
使用gettid()调用获取线程ID
通过在进程ID的位置传递线程ID,使用sched_setaffinity(....)设置CPU关联性
P.S:设置CPU亲和性后,我打算增加线程的调度优先级。
答案 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()