linux 執行緒id 與程序id對應關係

2021-07-04 10:40:31 字數 1658 閱讀 1897

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...