28

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

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

    通过将线程 ID 作为参数传递,使用 pthread_setaffinity_np(....) 设置 CPU 亲和性

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

    使用 sched_setaffinity(....) 通过传递线程 id 代替进程 id 来设置 CPU 亲和性

PS:设置CPU亲和性后,我打算提高线程的调度优先级。

4

2 回答 2

23

他们不一样。以下是我从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) 之上实现的

于 2011-06-16T13:05:17.537 回答
0

我相信gettid()仅作为系统调用存在并且没有直接作为 API 调用公开的事实可能意味着“只有在您绝对确定自己在做什么时才使用它”并且gettid()并不意味着可移植。

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

于 2012-12-28T13:11:17.943 回答