详解详解Linux获取线程的获取线程的PID((TID、、LWP)的几种方式)的几种方式
在 Linux C/C++ 中通常是通过 pthread 库进行线程级别的操作。
在 pthread 库中有函数:
pthread_t pthread_self(void);
它返回一个 pthread_t 类型的变量,指代的是调用 pthread_self 函数的线程的 “ID”。
怎么理解这个“ID”呢?
这个“ID”是 pthread 库给每个线程定义的进程内唯一标识,是 pthread 库维持的。
由于每个进程有自己独立的内存空间,故此“ID”的作用域是进程级而非系统级(内核不认识)。
其实 pthread 库也是通过内核提供的系统调用(例如clone)来创建线程的,而内核会为每个线程创建系统全局唯一的“ID”来唯
一标识这个线程。
这个系统全局唯一的“ID”叫做线程PID(进程ID),或叫做TID(线程ID),也有叫做LWP(轻量级进程=线程)的。
如何查看线程在内核的系统全局唯一如何查看线程在内核的系统全局唯一“ID”呢?大体分为以下几种方式。呢?大体分为以下几种方式。
测试代码:
main.c
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
void *start_routine(void *arg) {
char msg[32] = "";
snprintf(msg, sizeof(msg)-1, "thd%d: i am thd%d", *((int *)arg), *((int *)arg));
while (1) {
write(1, msg, strlen(msg));
sleep(1);
}
}
int main() {
int th1 = 1;
pthread_t tid1;
pthread_create(&tid1, NULL, start_routine, &th1);
int th2 = 2;
pthread_t tid2;
pthread_create(&tid2, NULL, start_routine, &th2);
int th3 = 3;
pthread_t tid3;
pthread_create(&tid3, NULL, start_routine, &th3);
const char *msg = "main: i am main";
while (1) {
write(1, msg, strlen(msg));
sleep(1);
}
return 0;
}
在主线程中通过 pthread 库创建三个线程,不断输出 “i am xxx” 的信息。
评论1
最新资源