2014-01-23 60 views
1

所以在htop我看到一個非常糟糕的線程從一個內核中消耗了70%。如何從C++代碼獲得linux上的線程pid?

enter image description here

而且我想我的應用程序邏輯映射到線程執行PID它說

Network read pid 22882 
Network write pid 22874 

所以我不知道如何從它那裏得到執行的線程的PID?

要創建一個線程我用boost::thread

+1

使用'gettid'得到'tid' THEAD – sujin

回答

0

可以使用pthread_self()http://pubs.opengroup.org/onlinepubs/007908799/xsh/pthread_self.html)得到線程的線程標識符......然而,由於一個進程可以擁有多個線程,所有的線程將報告相同的PID(使用http://linux.die.net/man/3/getpid)...

+0

的如果一個線程具有相同的PID調用它們是如何顯示在'htop'不同? – DuckQueen

+0

1.你可以在https://github.com/ramen/htop/blob/master/htop.c看到htop源代碼,2.很有可能你看到的不是線程,而是子進程,因爲它們有一個獨特的PID(可能用叉子創建) – fritzone

2

使用getpid()得到pid。使用gettid()可獲得tid(線程ID)。

GETPID()返回調用進程的進程ID

gettid()返回調用者線程ID(TID)。在單線程進程中,線程ID等於進程ID(PID,由getpid(2)返回)。在多線程進程中,所有線程都具有相同的PID,但每個線程都有唯一的TID。

0

螺紋linux進程具有

(1)的OS PID由過程中的所有線程共享 - 使用getpid

(2)的過程中的每個線程有其自己的OS線程id - 使用gettid

(3)pthreads線程ID用於在進行各種與pthread相關的調用時通過pthreads來標識線程。

您對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); 
} 
相關問題