我正在尝试在 Linux 上设置线程的 CPU 亲和性。我想知道推荐以下哪种方法:
使用 pthread_self() 获取线程 ID
通过将线程 ID 作为参数传递,使用 pthread_setaffinity_np(....) 设置 CPU 亲和性
使用 gettid() 调用获取线程 ID
使用 sched_setaffinity(....) 通过传递线程 id 代替进程 id 来设置 CPU 亲和性
PS:设置CPU亲和性后,我打算提高线程的调度优先级。
他们不一样。以下是我从TLPI收集的一些内容(我找不到一个足够大的块来完全描述这一点)。如果你赶时间,你可能只想要最后一部分。
gettid
Linux 2.4 引入了一个新的系统调用,gettid()
允许线程获得自己的线程 ID。
线程组中的每个线程都由唯一的线程标识符来区分。线程 ID 使用与进程 ID 相同的数据类型表示pid_t
。线程 ID 在系统范围内是唯一的,内核保证没有线程 ID 与系统上的任何进程 ID 相同,除非线程是进程的线程组领导。
pthread_self
进程中的每个线程都由线程 ID 唯一标识。线程可以使用 获取自己的 ID pthread_self()
。
需要该pthread_equal()
函数来比较线程 ID,因为pthread_t
必须将数据类型视为不透明数据。
在 Linux 线程实现中,线程 ID 在进程中是唯一的。但是,在其他实现中不一定是这种情况,SUSv3 明确指出应用程序不能可移植地使用线程 ID 来标识另一个进程中的线程。
gettid
对比pthread_self
POSIX 线程 ID 与特定于 Linux 的gettid()
系统调用返回的线程 ID 不同。POSIX 线程 ID 由线程实现分配和维护。返回的线程 IDgettid()
是一个由内核分配的数字(类似于进程 ID)。
我会去,pthread_setaffinity_np
但要注意手册说:
这些函数是在 sched_setaffinity(2) 之上实现的
我相信gettid()
仅作为系统调用存在并且没有直接作为 API 调用公开的事实可能意味着“只有在您绝对确定自己在做什么时才使用它”并且gettid()
并不意味着可移植。
如果你坚持,你应该会更好pthread
。您可以稍后更改调度策略/优先级pthread_setschedparam()