Linux学习-多任务(线程)
定义
轻量级进程,实现多任务并发,是操作系统任务调度最小单位(进程是资源分配最小单位 )。
创建
由进程创建,属于进程内执行单元。
- 独立:线程有8M 独立栈区 。
- 共享:与所属进程及进程内其他线程,共享堆区、数据区、文本区(代码、全局变量等共享 )。
进程是操作系统资源分配最小单位
线程是操作系统任务调度的最小单位
调度
宏观并行(多线程看似同时执行 )、微观串行(CPU 单核时,线程交替占用 CPU ,实际串行执行 )。
消亡
1. 线程退出(主动结束任务逻辑 )。
2. 回收线程资源(栈区等,需避免内存泄漏 )。
进程与线程的区别
相关编程
创建
pthread_create
#include <pthread.h>
int pthread_create(
pthread_t *thread, // 存储新线程ID的变量地址
const pthread_attr_t *attr, // 线程属性(传NULL用默认属性)
void *(*start_routine)(void *), // 线程执行函数(函数指针)
void *arg // 传给线程函数的参数
);
功能
创建新线程,与进程内其他线程并发执行。
参数
thread :成功创建后,线程 ID 存入该地址。
attr :控制线程属性(如栈大小、优先级),一般传 NULL 用默认配置。
start_routine :线程启动后执行的函数(需符合 void* func(void*) 格式 )。
arg :传给线程函数的参数(需强制类型转换时,用 (void*) 处理 )。
返回值
成功返回 0 ,失败返回非 0 错误码。
线程标识
pthread_self
pthread_t pthread_self(void);
功能
获取当前线程的 ID,用于线程身份识别(如打印、判断 )。
线程退出
pthread_exit
void pthread_exit(void *retval);
功能
主动终止当前线程, retval 是线程退出返回值(可被 pthread_join 捕获 )。
注意:主线程调用会直接退出,子线程调用仅终止自身。
线程回收
pthread_join
int pthread_join(pthread_t thread, void **retval);
功能
阻塞等待指定线程结束,回收其资源,类似进程的 wait 。
参数
- thread :要回收的线程 ID。
- retval :存储线程退出返回值( pthread_exit 的参数 ),传 NULL 则不捕获。
返回值
成功 0 ,失败非 0。
线程回收策略
(一)分离属性线程
- 特点:无需其他线程回收,由操作系统自动回收资源。
- 适用场景:线程结束后无需通知父线程,或无空闲线程协助回收时(如后台守护线程 )。
(二)非分离属性线程
- 特点:需通过 pthread_join 阻塞回收,父线程调用后等待线程结束,释放资源。
- 适用场景:需同步等待线程结果,或需捕获线程退出状态时。
线程属性(核心:分离属性 )
(一)分离属性定义
- 线程无需被其他线程回收,结束后由操作系统自动清理资源。
- 函数: int pthread_detach(pthread_t thread);
- 功能:将指定线程设置为分离属性。
- 参数: thread 为目标线程 ID。
- 返回:成功 0 ,失败非 0 。
(二)非分离属性(默认)
- 线程需被其他线程(如创建者)通过 pthread_join 回收,否则可能成为“僵尸线程”。
- 默认行为:线程创建后默认是非分离属性,需主动处理回收。
线程之间通信与互斥
全局变量通信
利用线程共享进程全局变量、堆区数据的特性,直接读写全局变量实现通信。
临界资源
多个线程可同时访问的资源,如:
- 全局变量、共享内存、文件描述符等。
资源竞争
多线程并发访问临界资源时,操作顺序不确定,可能导致数据混乱(如计数错误、数据不完整 )。
互斥机制
通过互斥锁(Mutex) 实现排他性访问:同一时间仅允许一个线程访问临界资源。
实现步骤
1. 定义锁 pthread_mutex_t mutex; 声明互斥锁变量
2. 初始化 pthread_mutex_init(&mutex, NULL); 初始化锁( NULL 用默认属性)
3. 加锁 pthread_mutex_lock(&mutex); 阻塞加锁,确保临界区独占访问
4. 访问资源 读写临界资源(如全局变量) 临界区操作
5. 解锁 pthread_mutex_unlock(&mutex); 释放锁,允许其他线程访问
6. 销毁锁 pthread_mutex_destroy(&mutex); 释放锁资源(不再使用时调用)
pthread_mutex_init
int pthread_mutex_init(
pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr
);
功能
初始化互斥锁。
参数
- mutex :锁对象地址(需提前声明 pthread_mutex_t 变量 )。
- attr :锁属性(传 NULL 用默认属性 )。
返回值
成功 0 ,失败 -1 。