当前位置: 首页 > 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.dtcms.com/a/336392.html

相关文章:

  • LangChain4j
  • 三分钟在VMware虚拟机安装winXP教程,开箱即用
  • HTTP0.9/1.0/1.1/2.0
  • linux下timerfd和posix timer为什么存在较大的抖动?
  • USB-A 3.2 和 USB-A 2.0的区别
  • 集成电路学习:什么是ORB方向性FAST和旋转BRIEF
  • 外贸电商选品方案的模型
  • 天地图应用篇: 增加缩放、比例尺控件
  • 集运业务突围:三大关键问题的智能化解决方案
  • 【数据结构与算法-Day 16】队列的应用:广度优先搜索(BFS)的基石与迷宫寻路实战
  • vulnhub-lampiao靶机渗透
  • 002.Redis 配置及数据类型
  • 安装pytorch3d后报和本机cuda不符
  • LLM、RAG、Agent知识点思维导图
  • 简单了解BeanFactory和FactoryBean的区别
  • AMBA-AXI and ACE协议详解(八)
  • Critic-V: VLM Critics Help Catch VLM Errors in Multimodal Reasoning(CVPR 2025)
  • C++零拷贝网络编程实战:从理论到生产环境的性能优化之路
  • Word和Excel的一些功能记录
  • PHP现代化全栈开发:测试驱动开发与持续交付实践
  • 重温k8s基础概念知识系列二(Pod)
  • 腾讯开源:视频生成框架Hunyuan-GameCraft
  • 说一下事件传播机制
  • LeeCode 39.组合总和
  • 第4章 鼎鼎大名的Reactor模式
  • Redis--day7--黑马点评--优惠券秒杀
  • steam_api64.dll丢失?steam_api64.dll修复工具
  • 837. 新 21 点
  • C语言基础:(十六)深入理解指针(6)
  • 在鸿蒙里优雅地处理网络错误:从 Demo 到实战案例