multithreading - 列出当前进程中的所有线程?

标签 multithreading linux-kernel

我正在尝试实现一个系统调用,它允许我获取当前进程的线程数。我是 Linux 内核的新手,所以对它的理解有限。

目前,我正在尝试遍历所有 task_struct,并将它们的线程组领导者的 PID 与当前线程组领导者的 PID 进行比较:

// ...
int nthreads = 0;
struct task_struct *task_it;
for_each_process(task_it) {
    if (task_it->group_leader->pid == current->group_leader->pid) {
        nthreads++;
    }
}
// ...

但是,这似乎不起作用(生成一些 pthread 的快速测试仍然给出 1group_leader 对相同的过程?

最佳答案

您的代码的问题在于内核调用 PID(task_structpid 字段)是用户空间调用 TID 的内容(即它是返回的内容sys_gettid() 并且每个线程都是唯一的)。用户空间称为 PID 的东西在内核中称为 TGID(“任务组 ID”)——这就是 sys_getpid() 系统调用返回的内容。

虽然您不需要实际检查 TGID - 只需比较 struct task_struct * 指针就足够了:

if (task_it->group_leader == current->group_leader) {

顺便说一句,您可以遍历 current 是其成员的 thread_group 列表(使用 while_each_thread()),然后你根本不需要任何测试。或者甚至更好,只需使用 get_nr_threads(current)

请注意,所有循环任务列表的方法都需要包装在 rcu_read_lock();/rcu_read_unlock(); 中才能正确。

关于multithreading - 列出当前进程中的所有线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13002444/

相关文章:

java - 在 Executors.withFixedSizePool 中创建固定大小的数据库连接

linux - ethercat 模块的以太网驱动程序

c - 无法发现 echo 内核模块中的错误

linux - 理解从进程内核栈中获取task_struct指针

c++ - 为什么 C++17 中没有 std::future::then?

java - 如何在java中暂停预先实现的Runnable类?

Linux内核中断处理程序互斥保护?

c - 将已弃用的 "dev_attrs"属性替换为 "dev_groups"

java - Javafx 是否支持启动您自己的线程?

multithreading - 在一个线程中读取数据而在另一个线程中写入数据是否对操作系统造成危险?