如何从pthread获取pid

时间:2011-09-01 13:39:42

标签: c++ linux pthreads

在RH Linux中,每个pthread都映射到pid,可以在htop等工具中监控。但我怎么能得到线程的pid? getpid()只返回主线程的pid。

7 个答案:

答案 0 :(得分:23)

有两个线程值混淆了。 pthread_self()将返回POSIX线程ID; gettid()将返回操作系统线程ID。后者是特定于Linux的,并不保证可移植,但可能是你真正想要的。

编辑正如PlasmaHH所说,gettid()是通过syscall()调用的。从syscall()手册页:

   #define _GNU_SOURCE
   #include <unistd.h>
   #include <sys/syscall.h>
   #include <sys/types.h>

   int
   main(int argc, char *argv[])
   {
       pid_t tid;

       tid = syscall(SYS_gettid);
   }

答案 1 :(得分:8)

<强> pthread_self();

可以调用以返回调用线程的ID。

PID也是进程Id,线程有线程Id而不是PID。在同一进程中运行的所有线程都将具有相同的PID。

答案 2 :(得分:2)

PID是进程ID,而不是线程ID。在同一进程上运行的线程显然都与相同的PID相关联。

因为pthreads试图可移植,所以无法直接获取底层OS线程的ID。甚至可能没有底层的OS线程。

答案 3 :(得分:1)

pthread_self 获取tid。它提供了pthread_t类型的句柄或指针,用于pthread函数。

请点击此处查看真实世界计划可能返回的示例:

http://www.c-plusplus.de/forum/212807-full

答案 4 :(得分:1)

实际上pthread_self返回pthread_t而不是您可以使用的整数线程ID,以下帮助函数将以可移植的方式在不同的POSIX系统中获取它。

uint64_t gettid() {
    pthread_t ptid = pthread_self();
    uint64_t threadId = 0;
    memcpy(&threadId, &ptid, std::min(sizeof(threadId), sizeof(ptid)));
    return threadId;
}

答案 5 :(得分:0)

我认为您正在寻找的功能是pthread_self

答案 6 :(得分:0)

线程有tids(threadIds),并且所有线程都在同一进程(pid)中运行。所以,你的线程应该都具有相同的pid,假设它们是在同一个进程中创建的,那么它们将具有不同的tid。

pthread_self()给出了tid,getpid()得到了pid。