【发布时间】:2022-10-12 21:49:33
【问题描述】:
是否可以获取当前在逻辑核心(例如逻辑核心 0)上运行的线程的 TID?这在内核空间很容易做到,但我不确定如何从用户空间获取线程信息。
【问题讨论】:
-
此信息通常不会公开,因为它可能导致各种安全问题。就内核而言,这不是用户空间进程的业务。如果你真的想要,你可以做一个内核扩展来创建一个文件,你可以读取这些信息被转储的地方。
标签: c linux multithreading
是否可以获取当前在逻辑核心(例如逻辑核心 0)上运行的线程的 TID?这在内核空间很容易做到,但我不确定如何从用户空间获取线程信息。
【问题讨论】:
标签: c linux multithreading
您可以使用hwloc-ps(需要hwloc 包)获取运行在哪个内核上的信息。例如,hwloc-ps -a -t -l -e 为您提供了哪个进程的哪些线程在哪个 PU(即逻辑核心)上运行。提供的信息是线程的名称和 SPID(当然就是您所说的 TID)。您可以通过查看/proc/TARGET_PROCESS_PID/task/TARGET_THREAD_SPID/ 获得更多信息。尽管hwloc-ps 显然不需要高级权限,但最后一个操作需要额外的权限(显然是出于安全原因)。
【讨论】:
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。您真正知道的是,在您询问和返回信息之间的某个时刻,该线程正在该核心上运行。但是,由于抢占式调度,可以随时将不同的线程放在该核心上。
【讨论】: