2014-01-13 148 views

回答

52

pthread_self()函數將給出當前線程的線程ID。

pthread_t pthread_self(void); 

pthread_self()函數返回調用線程的Pthread句柄。 pthread_self()函數不會返回調用線程的整數線程。您必須使用pthread_getthreadid_np()來返回該線程的整體標識符。

注:

pthread_id_np_t tid; 
tid = pthread_getthreadid_np(); 

比這些調用顯著較快,但提供相同的行爲。

pthread_id_np_t tid; 
pthread_t   self; 
self = pthread_self(); 
pthread_getunique_np(&self, &tid); 
+20

原來的問題是關於Linux。 Linux不包含_np函數。 (它不包括他們的手冊頁,我沒有進一步檢查。) –

+0

pthread_threadid_np在OS X> = 10.6和iOS> = 3.2上可用。 – bleater

+0

@Bleater你能否提供'pthread_threadid_np'的官方文檔。需要用於某個項目,因此需要檢查iOS和OSX平臺中該API的可靠性。請參閱http://www.opensource.apple.com/source/Libc/Libc-583/pthreads/pthread.h鏈接,但不確定它們是否正確。 –

9

得到一個進程的PID可以使用pthread_self()

父得到pthread_create()被成功地執行後才知道線程ID,但在執行的線程,如果我們想訪問線程ID我們必須使用功能pthread_self()

6

正如在其他答案中指出的,pthreads沒有定義一個獨立於平臺的方式來檢索整體線程ID。

在Linux系統中,你可以得到線程ID這樣的:

#include <sys/types.h> 
pid_t tid = gettid(); 

在許多基於BSD的平臺,這個答案https://stackoverflow.com/a/21206357/316487給人一種不可移植的方式。

不過,如果你認爲原因你需要一個線程ID是要知道你在相同或不同的線程你操控另一個線程運行時,您可能會發現一些實用這種方法

static pthread_t threadA; 

// On thread A... 
threadA = pthread_self(); 

// On thread B... 
pthread_t threadB = pthread_self(); 
if (pthread_equal(threadA, threadB)) printf("Thread B is same as thread A.\n"); 
else printf("Thread B is NOT same as thread A.\n"); 

如果您只需要知道您是否在主線程中,則還有其他方法,請參閱how can I tell if pthread_self is the main (first) thread in the process?的回答。

+1

對不起,說它不能與我的Ubuntu 17.04。 –

26

什麼?這個人要求Linux具體,相當於getpid()。不是BSD或Apple。答案是gettid()並返回一個整數類型。你將不得不調用它使用系統調用(),像這樣:

#include <sys/types.h> 
#include <sys/syscall.h> 

.... 

pid_t x = syscall(__NR_gettid); 

雖然這可能無法移植到非Linux系統中,線程ID是直接的可比性和非常快速的獲取。它可以像正常整數一樣打印(如LOG)。

3

這個單行給出你的PID,每個threadid和spid。

printf("before calling pthread_create getpid: %d getpthread_self: %lu tid:%lu\n",getpid(), pthread_self(), syscall(SYS_gettid)); 
1

pthread_getthreadid_np不在我的Mac os上x。 pthread_t是一種不透明類型。不要揍你的頭。只需將其分配給void*並稱之爲好。如果您需要printf請使用%p

+0

是的,這有效。我需要的只是打印它進行調試,所以0x23423423423abcdef與tid = 1234一樣有幫助。謝謝! –

2
pid_t tid = syscall(SYS_gettid); 

Linux提供了這樣的系統調用,以允許您獲取線程的標識。

0

還有另一種獲取線程ID的方法。雖然與

int pthread_create(pthread_t * thread, const pthread_attr_t * attr, void * (*start_routine)(void *), void *arg);

函數調用創建線程;第一個參數pthread_t * thread實際上是一個線程ID(即在bits/pthreadtypes.h中定義的無符號長整型int)。另外,最後一個參數void *arg是傳遞給要被線程化的void * (*start_routine)函數的參數。

您可以創建一個結構來傳遞多個參數並將指針發送到結構。

typedef struct thread_info { 
    pthread_t thread; 
    //... 
} thread_info; 
//... 
tinfo = malloc(sizeof(thread_info) * NUMBER_OF_THREADS); 
//... 
pthread_create (&tinfo[i].thread, NULL, handler, (void*)&tinfo[i]); 
//... 
void *handler(void *targs) { 
    thread_info *tinfo = targs; 
    // here you get the thread id with tinfo->thread 
}