【问题标题】:Get TID of thread running on CPU获取在 CPU 上运行的线程的 TID
【发布时间】:2022-10-12 21:49:33
【问题描述】:

是否可以获取当前在逻辑核心(例如逻辑核心 0)上运行的线程的 TID?这在内核空间很容易做到,但我不确定如何从用户空间获取线程信息。

【问题讨论】:

  • 此信息通常不会公开,因为它可能导致各种安全问题。就内核而言,这不是用户空间进程的业务。如果你真的想要,你可以做一个内核扩展来创建一个文件,你可以读取这些信息被转储的地方。

标签: c linux multithreading


【解决方案1】:

您可以使用hwloc-ps(需要hwloc 包)获取运行在哪个内核上的信息。例如,hwloc-ps -a -t -l -e 为您提供了哪个进程的哪些线程在哪个 PU(即逻辑核心)上运行。提供的信息是线程的名称和 SPID(当然就是您所说的 TID)。您可以通过查看/proc/TARGET_PROCESS_PID/task/TARGET_THREAD_SPID/ 获得更多信息。尽管hwloc-ps 显然不需要高级权限,但最后一个操作需要额外的权限(显然是出于安全原因)。

【讨论】:

    【解决方案2】:

    IDK 该问题的答案,但在任何情况下,答案都不太可能对您有用。

    如果你能得到信息(@Jérôme Richard 认为你能够得到它),然后您将返回的内容会告诉您在您询问和返回信息之间的某个瞬间。但是您将如何处理这些信息?像这样的东西?

    int core_of_interest;
    pid_t thread_of_interest;
    ...
    if (thread_on_core(core_of_interest) == thread_of_interest) {
        do_interesting_thing();
    }
    

    该代码将无法可靠地工作。问题是,在调用do_interesting_thing() 时,无法保证在 core_of_interest 上运行的线程仍然是 thread_of_interest。您真正知道的是,在您询问和返回信息之间的某个时刻,该线程正在该核心上运行。但是,由于抢占式调度,可以随时将不同的线程放在该核心上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      相关资源
      最近更新 更多