在linux c程序中,如何打印由pthread庫創建的線程的線程ID?
爲前:我們可以通過getpid()
如何在linux c程序中獲得pthread的線程ID?
回答
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);
得到一個進程的PID可以使用pthread_self()
父得到pthread_create()
被成功地執行後才知道線程ID,但在執行的線程,如果我們想訪問線程ID我們必須使用功能pthread_self()
。
正如在其他答案中指出的,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?的回答。
對不起,說它不能與我的Ubuntu 17.04。 –
什麼?這個人要求Linux具體,相當於getpid()。不是BSD或Apple。答案是gettid()並返回一個整數類型。你將不得不調用它使用系統調用(),像這樣:
#include <sys/types.h>
#include <sys/syscall.h>
....
pid_t x = syscall(__NR_gettid);
雖然這可能無法移植到非Linux系統中,線程ID是直接的可比性和非常快速的獲取。它可以像正常整數一樣打印(如LOG)。
這個單行給出你的PID,每個threadid和spid。
printf("before calling pthread_create getpid: %d getpthread_self: %lu tid:%lu\n",getpid(), pthread_self(), syscall(SYS_gettid));
pthread_getthreadid_np
不在我的Mac os上x。 pthread_t
是一種不透明類型。不要揍你的頭。只需將其分配給void*
並稱之爲好。如果您需要printf
請使用%p
。
是的,這有效。我需要的只是打印它進行調試,所以0x23423423423abcdef與tid = 1234一樣有幫助。謝謝! –
pid_t tid = syscall(SYS_gettid);
Linux提供了這樣的系統調用,以允許您獲取線程的標識。
還有另一種獲取線程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
}
- 1. 如何獲得線程ID在C#
- 2. 如何在RH Linux中獲得pthread
- 3. 在Linux中恢復pthread上下文(線程ID)
- 4. 如何從RWThreadId獲取Linux線程ID?
- 5. 如何在Linux上監視多線程(pthread)C++程序的每個線程行爲?
- 6. 檢測C中的等待線程Pthread
- 7. pthread多線程
- 8. 如何獲取C++程序的線程ID?
- 9. 如何獲得知道線程ID的消息線程URL?
- 10. 如何獲得XMPP聊天線程的線程ID?
- 11. 如何在Linux中獲得C語言中當前進程的處理器ID?
- 12. 如何獲得整數線程ID在C++ 11
- 13. 如何從C++代碼獲得linux上的線程pid?
- 14. 在linux中的C線程?
- 15. pthread退出線程池中的線程
- 16. 獲取Linux中Java線程的線程ID
- 17. Qt在主線程中獲得線程ID?
- 18. 在C編程中的線程(linux)
- 19. 如何在java中獲得進程ID?
- 20. C程序併發與pthread
- 21. 你如何獲得線程的進程ID?
- 22. 如何在Linux上分析多線程C++應用程序?
- 23. 如何在Perl GTK程序中獲得跨線程通信?
- 24. 如何在linux中獲得程序的完整路徑?
- 25. 如何獲得Linux中線程的調度統計信息?
- 26. 重用線程pthread
- 27. 如何在linux上打印一個進程的所有線程的線程ID
- 28. 如何獲得控制檯的進程id在C#控制檯應用程序
- 29. C(linux)中的線程
- 30. 如何在Linux下獲得C++程序中調用的函數的打印?
原來的問題是關於Linux。 Linux不包含_np函數。 (它不包括他們的手冊頁,我沒有進一步檢查。) –
pthread_threadid_np在OS X> = 10.6和iOS> = 3.2上可用。 – bleater
@Bleater你能否提供'pthread_threadid_np'的官方文檔。需要用於某個項目,因此需要檢查iOS和OSX平臺中該API的可靠性。請參閱http://www.opensource.apple.com/source/Libc/Libc-583/pthreads/pthread.h鏈接,但不確定它們是否正確。 –