news 2026/9/4 6:06:41

从零开始的敲代码生活--Linux应用软件(线程)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零开始的敲代码生活--Linux应用软件(线程)

一、线程的概念

线程是轻量级的进程,用于实现多任务并发。

  • 线程:操作系统CPU任务调度的最小单位
  • 进程:操作系统资源分配的最小单位

二、线程的创建

线程隶属于某一个进程,由所属进程创建。

  • 线程会分配独立栈空间(默认8M)
  • 同进程下所有线程共享堆区、数据区、文本代码区、内核空间。

三、进程与线程的区别

对比项进程线程
概念操作系统资源分配的最小单位CPU任务调度的最小单位
效率创建开销大创建速度快,切换开销小
内存内存消耗大,并发数量受限仅独立栈区,其余资源和进程共享
安全性进程空间完全独立,安全性高共享地址空间,安全性较差
通信不能直接通信,依赖IPC进程间通信可直接通过全局变量、队列通信

四、线程的调度

调度逻辑和进程相同:宏观并行,微观串行。

五、线程消亡

两个阶段:

  1. 线程退出
  2. 回收线程资源空间

六、线程相关函数接口

1. pthread_create 创建线程

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);

参数说明:

  • thread:保存线程ID的变量地址
  • attr:线程属性,传NULL使用默认属性
  • start_routine:线程任务函数指针,函数格式void *func(void *)
  • arg:传给线程任务函数的参数

返回值:成功返回0;失败返回非0错误码。

⚠重要注意

  1. 编译线程代码必须链接线程库:-lpthread/-pthread
  2. 主线程不要在线程执行完毕前直接结束进程,否则所有线程会直接销毁。

2. 线程退出的几种方式

  1. 线程任务函数执行结束return
  2. 整个进程退出
  3. 调用pthread_exit()主动退出线程

七、线程的分离属性与非分离属性

  • 分离属性 detach:线程结束由操作系统自动回收,其他线程不需要调用pthread_join回收。
int pthread_detach(pthread_t tid);

适用场景:其他线程没有机会做回收操作。

  • 非分离属性(默认):线程结束后资源不会自动释放,必须调用pthread_join回收。
int pthread_join(pthread_t thread, void **retval);

参数:

  • thread:待回收线程ID
  • retval:接收线程返回状态,不关心状态填NULL返回:成功0,失败非0。

    特性:阻塞等待目标线程结束。

八、线程的同步和互斥

1. 线程间通信

通信手段:全局变量、全局队列、pthread_create传参、条件变量。

临界资源:多个线程都可以访问的资源,例如全局变量、队列、文件。 临界区:访问临界资源的那一段代码。 多线程同时访问临界资源会产生资源竞争问题。

2. 互斥机制:互斥锁

实现多个线程排他访问临界资源。 使用步骤:

  1. 定义锁对象pthread_mutex_t
  2. pthread_mutex_init()初始化锁
  3. pthread_mutex_lock()加锁
  4. pthread_mutex_unlock()解锁
  5. pthread_mutex_destroy()销毁锁
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
  • mutex:锁对象地址
  • attr:锁属性,NULL使用默认属性 返回:成功0,失败非0。

其他锁类型:

  • 读写锁:读共享,写独占
  • 自旋锁:获取不到锁时,CPU空循环,不放弃CPU时间片

3. 同步机制:信号量semaphore

控制线程执行先后顺序,实现同步。 步骤:

  1. 创建信号量对象sem_t
  2. sem_init()初始化信号量
  3. sem_wait()P操作(申请信号量)
  4. sem_post()V操作(释放信号量)
  5. sem_destroy()销毁信号量
int sem_init(sem_t *sem, int pshared, unsigned int value);

参数:

  • sem:信号量对象地址
  • pshared0用于线程之间;非0用于进程之间
  • value:信号量初始值 返回:成功0,失败非0。

九、死锁

死锁:多线程环境,各个线程持有资源,又互相请求对方手里的资源,全部陷入永久等待。

常见死锁现象

  1. 忘记解锁
  2. 同一个锁重复加锁
  3. 多把锁,线程加锁顺序混乱(线程A拿锁1,线程B拿锁2;A请求锁2,B请求锁1)

死锁四个必要条件(全部满足才会死锁,破坏任意一条即可解除)

  1. 互斥条件:资源同一时刻只能被一个任务占用。
  2. 请求与保持条件:持有部分资源不释放,同时申请新资源。
  3. 不剥夺条件:资源只能持有者主动释放,别人不能强行抢夺。
  4. 循环等待条件:多个线程形成环路互相等待对方资源。

解决死锁方法

  1. 加锁解锁成对编写,不要漏写解锁。
  2. 所有线程加锁顺序保持一致,破坏循环等待。
  3. 使用非阻塞接口:pthread_mutex_trylock()sem_trywait(),拿不到锁主动释放已持有的锁资源。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 6:05:06

MOS管从原理到实战:结构、工作区、选型与开关电路设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 6:04:23

28 while循环

1、知识点 2、小结 3、案例

作者头像 李华
网站建设 2026/9/4 6:04:07

基于ADXL345与GSM的嵌入式老人跌倒检测系统设计

简介:本资源是一套完整的STM32嵌入式毕业设计项目,面向电子信息、自动化及物联网方向的本科生与初阶嵌入式开发者,聚焦老人居家安全监护场景,解决跌倒实时识别与远程求救响应难题。系统以STM32F103C8T6为核心,集成ADXL…

作者头像 李华
网站建设 2026/9/4 6:03:39

Reachy mini机器人学习平台:开源闭环与具身智能实践解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 6:01:38

云端编码实测:环境对齐与任务接续的完整落地指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 6:01:09

异构主板原理图深度解析:TI C2000 MCU与Anlogic FPGA协同设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华