当前位置: 首页 > news >正文

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 。


http://www.lryc.cn/news/624101.html

相关文章:

  • Python 项目里的数据清理工作(数据清洗步骤应用)
  • RK3588开发板Ubuntu系统烧录
  • 「数据获取」《中国教育统计年鉴》(1949-2023)(获取方式看绑定的资源)
  • Python @staticmethod 装饰器与 staticmethod() 函数
  • Spring AI 集成阿里云百炼平台
  • C语言课程开发
  • C11期作业17(07.05)
  • Effective C++ 条款47: 使用traits classes表现类型信息
  • JVM常用工具:jstat、jmap、jstack
  • Transformer架构的数学本质:从注意力机制到大模型时代的技术内核
  • 因果语义知识图谱如何革新文本预处理
  • 机器学习案例——对好评和差评进行预测
  • Python开发环境
  • 说一下事件传播机制
  • Pandas数据结构详解Series与DataFrame
  • 【C#补全计划】多线程
  • 《解构WebSocket断网重连:指数退避算法的前端工业级实践指南》
  • 代码随想录刷题——字符串篇(五)
  • MySQL数据库初识
  • Linux 服务:iSCSI 存储服务配置全流程指南
  • 「数据获取」《中国文化文物与旅游统计年鉴》(1996-2024)(获取方式看绑定的资源)
  • ICCV 2025 | Reverse Convolution and Its Applications to Image Restoration
  • 一键管理 StarRocks:简化集群的启动、停止与状态查看
  • HTTP请求方法:GET与POST的深度解析
  • 【技术博客】480p 老番 → 8K 壁纸:APISR × SUPIR × CCSR「多重高清放大」完全指南
  • PCA 实现多向量压缩:首个主成分的深层意义
  • 平行双目视觉-动手学计算机视觉18
  • Go语言并发编程 ------ 锁机制详解
  • C++析构函数和线程退出1
  • C++继承(2)