如何从C ++代码获取linux上的线程pid?

时间:2014-01-23 09:21:19

标签: c++ linux

所以在htop中,我看到一个非常糟糕的线程消耗了其中一个核心的70%。

enter image description here

我想将我的应用程序逻辑映射到执行它的线程pid

Network read pid 22882
Network write pid 22874

所以我想知道如何从中获取执行线程的pid?

要创建一个线程,我使用boost::thread

4 个答案:

答案 0 :(得分:2)

使用getpid()获取pid。使用gettid()获取tid(线程ID)。

  

getpid()返回调用进程的进程ID

     

gettid()返回调用者的线程ID(TID)。在单线程进程中,线程ID等于进程ID(PID,由getpid(2)返回)。在多线程进程中,所有线程都具有相同的PID,但每个线程都有一个唯一的TID。

答案 1 :(得分:1)

您可以从主题中调用getpid()函数。

答案 2 :(得分:1)

线程linux进程有

(1)流程中所有线程共享的OS pid - 使用getpid

(2)进程中的每个线程都有自己的操作系统线程ID - 使用gettid

(3)在进行各种与pthread相关的调用时,pthreads内部使用的pthreads线程id来识别线程。

您对htop感兴趣的值为(2),因此您需要使用gettid来显示它。

gettid目前没有调用包装器,因此您必须通过syscall访问它。下面的代码是gettid手册页中的示例。请注意,在此程序中,pid和tid将是相同的,因为它是单线程程序。

#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);
}

答案 3 :(得分:0)

您可以使用pthread_self()http://pubs.opengroup.org/onlinepubs/007908799/xsh/pthread_self.html)从线程获取线程标识符...但是由于进程可以有多个线程,因此所有线程都将报告相同的pid(使用{ {3}})......