一、什么是线程?
线程(Thread)是进程内的独立执行流,是操作系统调度的基本单位。简单理解:进程是 “资源分配的容器”,而线程是 “容器里真正干活的执行者”—— 一个进程至少包含一个主线程,多个线程共享进程的全部资源(虚拟地址空间、文件描述符、信号表等),但拥有独立的执行上下文(CPU 寄存器、栈空间)
线程的核心特点:
二、线程与进程的核心区别(对比表)
| 资源分配单位 | 独立分配虚拟地址空间、文件描述符等 | 共享所属进程的所有资源 |
| 调度执行单位 | 不直接调度,内核调度其主线程 | 内核直接调度的基本单位 |
| 上下文切换成本 | 高(需切换页表、地址空间等) | 低(仅切换 CPU 寄存器、栈) |
| 独立性 | 高(一个进程崩溃不影响其他进程) | 低(一个线程崩溃可能导致整个进程崩溃) |
| 通信方式 | 复杂(管道、消息队列、共享内存等) | 简单(共享全局变量、堆内存等) |
| 内核实现(Linux) | 独立 task_struct + 独立 mm_struct | 独立 task_struct + 共享 mm_struct |
三、Linux 中线程的内核实现:轻量级进程(LWP)
Linux 内核没有专门的线程结构体,线程的实现依赖 “轻量级进程(Lightweight Process, LWP)”—— 无论是进程还是线程,内核都用 task_struct(进程控制块)描述,二者的唯一区别是是否共享 mm_struct(虚拟地址空间)
- 进程:一个 task_struct 对应一个独立的 mm_struct(虚拟地址空间),即 “独占资源的主线程”
- 线程:多个 task_struct 共享同一个 mm_struct,即 “共享资源的执行流”
关键概念补充
四、线程的优缺点
优点:
缺点:
五、第一个 Linux 线程程序:Hello World(含代码)
Linux 中线程编程依赖 POSIX 线程库(pthread 库),需注意编译时链接 -lpthread 参数(否则会报未定义引用错误)
代码实现:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
// 线程执行函数:线程启动后会执行该函数
void* thread_func(void* arg) {
// arg为传递给线程的参数(需强制类型转换)
char* thread_name = (char*)arg;
printf("Hello World! 我是%s,线程ID:%lu\\n", thread_name, (unsigned long)pthread_self());
sleep(1); // 模拟线程执行任务
return NULL; // 线程退出,返回值为NULL
}
int main() {
pthread_t tid; // 存储线程ID
int ret;
// 1. 创建线程
// 参数:线程ID指针、线程属性(NULL为默认)、线程执行函数、传递给函数的参数
ret = pthread_create(&tid, NULL, thread_func, (void*)"线程1");
if (ret != 0) {
perror("pthread_create failed");
return -1;
}
printf("主线程ID:%lu,创建的线程ID:%lu\\n", (unsigned long)pthread_self(), (unsigned long)tid);
// 2. 回收线程(等待线程结束,避免线程成为僵尸线程)
ret = pthread_join(tid, NULL);
if (ret != 0) {
perror("pthread_join failed");
return -1;
}
printf("线程执行完毕,主线程退出\\n");
return 0;
}
关键说明:
- pthread_self():获取当前线程的 ID(用户态线程 ID,非内核 tid)
- pthread_create():创建线程,成功返回 0,失败返回错误码(需用 perror 或 strerror 打印错误信息)
- pthread_join():回收线程,阻塞主线程直到目标线程结束,避免线程资源泄漏
六、总结
- 线程是进程内的独立执行流,共享进程资源,调度成本低
- Linux 中线程本质是轻量级进程,通过 task_struct 描述,共享 mm_struct 区分于进程
- 入门线程编程的核心是掌握 pthread 库的基本使用,理解线程的创建与回收流程
下一篇将详细讲解线程的创建、终止、回收的完整用法,以及线程退出状态的处理,敬请关注!
网硕互联帮助中心




评论前必须登录!
注册