Linux -- 线程
线程
线程基本概念
线程:操作系统调度的最小单位,是进程内的一条执行路径。
一个进程可包含多个线程
同一进程内线程共享资源:地址空间、全局变量、堆、文件描述符
每个线程独有:栈、程序计数器、寄存器、上下文
线程核心特点
轻量级:创建 / 销毁 / 切换开销远小于进程
资源共享:线程间直接访问共享数据,通信极快
独立调度:可在多核 CPU 上真正并行
稳定性弱:一个线程崩溃 → 整个进程崩溃
进程 vs 线程(⭐)
| 对比项 | 进程 | 线程 |
|---|---|---|
| 资源 | 独立地址空间、独立资源 | 共享进程地址空间与资源 |
| 开销 | 创建 / 切换 / 销毁开销大 | 轻量,开销小 |
| 通信 | 管道 / 共享内存 / 消息队列等 | 直接读写共享变量 |
| 稳定性 | 进程间独立,互不影响 | 一个线程崩溃 → 进程崩溃 |
| 调度单位 | 以进程为单位 | 以线程为单位 |
线程核心 API
头文件:
#include <pthread.h>
编译必须加:-lpthread
gcc 1.c -o 1 -lpthread
1. 创建线程
int pthread_create( pthread_t *thread, // 输出:线程ID const pthread_attr_t *attr, // 线程属性,填NULL void *(*start_routine)(void*), // 线程入口函数 void *arg // 传给线程的参数 );
返回值:成功 = 0,失败 = 非 0
2. 等待线程结束(阻塞)
int pthread_join( pthread_t thread, // 要等待的线程ID void **retval // 接收线程返回值 );
作用:主线程阻塞,等待子线程结束再继续
3. 线程退出
void pthread_exit(void *retval);
retval:线程返回值(必须是全局 / 堆内存,不能是局部变量)
线程生命周期(⭐)
主线程如果不调用 pthread_join就先退出,会导致整个进程终止,子线程被强制杀死。
正确流程:
主线程创建子线程 → pthread_join 等待 → 主线程再退出
经典示例:线程计算 1~10 累加
#include <stdio.h> #include <stdlib.h> #include <pthread.h> int num = 0; // 全局变量,线程间共享 void* fun(void* arg) { for (int i = 0; i <= 10; i++) { num += i; } pthread_exit(&num); // 返回全局变量地址 } int main() { pthread_t id; pthread_create(&id, NULL, fun, NULL); printf("main running...\n"); int* s = NULL; pthread_join(id, (void**)&s); // 等待线程结束并接收返回值 printf("result = %d\n", *s); // 输出 55 return 0; }进程 = 资源容器
线程 = 执行单元
线程更轻、更快、共享资源,但稳定性更弱,需同步控制。
