linux 中的執行緒是基於程序實現的,每個執行緒都會有乙個程序對應,通過gettid()可以獲取到該程序id。
另外,通過pthread_self()獲取到的是posix thread id。
下面簡單舉個例子。
#include
#include
#include
#include
#include
#include
#include
#include
#define thread_stack_size 128*1024
static
void error_handler(const
char *arg)
static
void *thread_1(void *arg)
printf("---->thread 1 exit\n");
return;
}static
void *thread_2(void *arg)
printf("---->thread 2 exit\n");
return;
}void test_thread_init(void* thread_func())
if (pthread_attr_setstacksize (&attr, thread_stack_size) !=0)
if (pthread_attr_setdetachstate(&attr, pthread_create_detached) < 0)
if (pthread_create(&pthread_id, &attr, thread_func, null) < 0)
pthread_attr_destroy(&attr);
return;
}int main()
printf("====>main exit\n");
return
0;}
測試結果
$ gcc test.c -o test -lpthread
$ ./test
——thread main begin pid=8010, tid=8010, thread id=3075487488—–
——thread 1 begin pid=8010, tid=8011, thread id=3075484480—–
——thread 2 begin pid=8010, tid=8012, thread id=3075349312—–
*****===do a lot of work====
*****===do a lot of work====
^c$ ps -aux | grep test
lanyang 8010 0.0 0.0 2536 316 pts/1 sl+ 10:30 0:00 ./test
$ ls /proc/8010/task/
8010 8011 8012
從結果可以看到主線程建立了兩個執行緒
3075484480、3075349312對應的程序id分別為8011、8012.
由於gettid()沒有在標準c庫中,所以使用時要使用系統呼叫號去呼叫。系統呼叫號可以通過檢視檔案得到:
/usr/include/asm/unistd.h
執行緒ID與執行緒ID
1 nptl標準 1.目前的執行緒實現是 native posix thread library,簡稱nptl 2.執行緒又被稱為輕量級程序。3.每乙個使用者態的執行緒,在核心之中都對應乙個排程實體也擁有自己的程序描述符 task struct結構體 4.程序內的所有執行緒呼叫 getpid 函式時...
linux下的執行緒ID和程序ID
在描述執行緒id和程序id之前我們先來分清楚幾個概念 1.使用者級執行緒和核心級執行緒 什麼是使用者級執行緒?使用者級執行緒核心的切換由使用者態程式自己控制核心切換,不需要核心干涉,少了進出核心態的消耗,但不能很好的利用多核cpu,目前linux pthread大體是這麼做的。執行緒組id?執行緒組...
linux 下獲取執行緒ID
linux多執行緒環境下gettid pthread self 兩個函式都獲得執行緒id,但這2個id有所不同 gettid是核心中的執行緒的id posix thread id可以在乙個程序內唯一標識乙個執行緒,但如果放到系統範圍內的話就得用gettid了。include 需要包含這個標頭檔案in...