【问题标题】:What is the difference between pthread_self() and gettid()? Which one should I use?pthread_self() 和 gettid() 有什么区别?我应该使用哪一个?
【发布时间】:2011-09-16 08:35:28
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • roelf - 我遇到了这个问题,因为我有一个类似的问题。我注意到您不接受 cnicutar 的回答。你能指出我们有什么问题吗? (我试图避免错误的假设)。

标签: linux pthreads affinity


【解决方案1】:

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

gettid

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

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

pthread_self

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

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

在 Linux 线程实现中,线程 ID 在进程间是唯一的。但是,在其他实现中不一定是这种情况,SUSv3 明确指出,应用程序不能可移植地使用线程 ID 来识别另一个进程中的线程

gettidpthread_self

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

我会选择pthread_setaffinity_np,但请注意手册上说:

这些功能都是在上面实现的 sched_setaffinity(2)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 在 glibc 2.30 中添加了库支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 2021-04-15
    • 1970-01-01
    • 2022-07-30
    • 2012-02-15
    • 1970-01-01
    相关资源
    最近更新 更多