2011-09-01 126 views
11

的pid,每個pthread映射到一個pid,可以使用htop等工具監視pid。但我怎麼能得到一個線程的PID? getpid()只是返回主線程的pid。如何在RH Linux中獲得pthread

+0

[Linux 2.6的替換NPTL LinuxThreads的](http://drdobbs.com/open-source/184406204),Linux現在如下POSIX和正確地返回相同的PID的每個線程。 –

+2

你應該考慮「接受」你認爲有用的答案。 –

+0

Steve-o:也許是這樣,但linux仍然爲每個線程創建一個單獨的進程(每個線程都有自己的/ proc/,其中與主線程/進程不同) – Rahly

回答

10

pthread_self();

可以調用返回調用線程的ID。

此外,PID是進程ID,線程有線程ID不PID。在同一進程中運行的所有線程將具有相同的PID。

+13

Als downvote是因爲你說的是​​錯誤的。 Linux線程實際上可以用pid表示,因爲它們是輕量級的進程。事實上,在Linux unistd.h中存在以下函數:pid_t gettid(void)。另一方面,Windows具有真正的獨立線程ID。 – ThreeBit

2

PID是進程ID,而不是線程ID。在同一個進程上運行的線程顯然都與同一個PID相關聯。

由於pthreads嘗試是可移植的,因此無法直接獲取底層OS線程的ID。甚至有可能沒有底層的OS線程。

+0

或者更確切地說,由於NPTL線程不再註冊爲流程。 –

0

線程都TIDS(線程ID),並將所有線程在同一進程(PID)運行。所以,你的線程應該都具有相同的pid,假設它們是在同一個進程中創建的,不管它們會有不同的tid。

pthread_self()給出了tid,getpid()獲取了pid。

22

有兩個線程值會混淆。 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); 
    } 
+0

請注意,gettid()沒有glibc包裝,需要通過系統調用() – PlasmaHH

+0

@ PlasmaHH調用 - 對,我應該補充一點。系統調用手冊頁以此爲例。 – Duck

+0

gettid()是[有爭議的](http://airlied.livejournal.com/74826.html) –

1

pthread_self不得到TID。它提供了一個pthread_t類型的句柄或指針,以用於pthread函數。

看到這裏的一個例子什麼是真正的世界程序可能會返回:

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

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