目录

一、线程间通信基础

1. 概念

2. 通信基础:共享空间

二、互斥锁(Mutex)

1. 概念

2. 使用流程

3. 函数接口

三、死锁

1. 概念

2. 死锁产生的 4 个必要条件

3. 避免死锁的方法

四、信号量(Semaphore)

1. 概念

2. 函数接口

3. 应用场景

一、线程间通信基础

1. 概念

线程间通信指多个线程之间传递信息的过程,是多线程协作完成任务的核心机制

2. 通信基础:共享空间

同一进程中的多个线程共享以下资源,这是线程间通信的基础:

  • 文本段(代码区)
  • 数据段(全局变量、静态变量等)
  • 堆区(动态分配的内存空间)

注意:线程独享栈区(默认 8M),栈区数据不共享;因此线程间通信主要依赖共享的全局变量、堆区数据等

采用全局变量的原因:

  • 进程是操作系统资源分配的最小单元
  • 每个进程空间独立的,包含文本段+数据段(全局变量)+系统数据段
  • 一个进程中的多个线程独享栈空间,文本段、数据段、堆区进程多线程共享

同一进程的线程共享全局变量、静态变量、堆区数据(malloc 分配),但局部变量(栈区)不共享;因此线程间通信需通过共享变量,避免使用栈区数据

  • 多线程同时操作共享空间会引发资源竞争,需要加上互斥锁解决资源竞争问题

二、互斥锁(Mutex)

1. 概念

  • 互斥锁是解决多线程资源竞争的核心机制,可视为一种 "独占性资源"
  • 特性:同一时间只能有一个线程获得锁,加锁期间其他线程需等待解锁后才能再次加锁
  • 临界区:加锁和解锁之间的代码段,即被互斥锁保护的共享资源操作代码
  • 只能防止多个线程对资源的竞争,不能决定代码的先后执行顺序
  • 原子操作:CPU 执行加锁 / 解锁操作时无法切换任务,保证操作的不可分割性

2. 使用流程

1. 定义互斥锁(全局变量)
2. 对锁初始化
3. 操作全局资源前先加锁
4. 如果加锁成功则完成对全局资源操作
5. 如果加锁失败则表示有人占用资源,必须等待其余人释放锁资源才能加锁成功
6. 直到加锁成功使用该全局资源

3. 函数接口

函数名原型功能参数说明返回值
pthread_mutex_initint pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr)初始化互斥锁

mutex

互斥锁变量地址
attr

锁属性(默认 NULL,使用默认属性)

成功返回 0

失败返回 - 1

pthread_mutex_lockint pthread_mutex_lock(pthread_mutex_t *mutex)互斥锁加锁

mutex

互斥锁变量地址

成功返回 0

失败返回 - 1(若锁已被占用,会阻塞等待)

pthread_mutex_unlockint pthread_mutex_unlock(pthread_mutex_t *mutex)互斥锁解锁

mutex

互斥锁变量地址

成功返回 0

失败返回 - 1

pthread_mutex_destroyint pthread_mutex_destroy(pthread_mutex_t *mutex)销毁互斥锁

mutex

互斥锁变量地址

成功返回 0

失败返回 - 1

三、死锁

1. 概念

多线程因加锁 / 解锁顺序错误,导致线程相互等待对方释放锁资源,程序无法继续执行的状态。

2. 死锁产生的 4 个必要条件

条件说明
互斥条件资源(如锁)只能被一个线程占用
不可剥夺条件线程占用的资源不能被强制剥夺
请求保持条件线程持有部分资源,同时请求其他资源
循环等待条件线程间形成资源请求循环(如线程 1 等待线程 2 的锁,线程 2 等待线程 1 的锁)

3. 避免死锁的方法

  1. 保持加锁顺序一致:所有线程按固定顺序加锁(如先锁 A 再锁 B)
  2. 使用非阻塞加锁:用pthread_mutex_trylock(尝试加锁,失败时不阻塞,返回错误码)替代pthread_mutex_lock
  3. 限时加锁:设置加锁超时时间,超时后释放已持有的锁

四、信号量(Semaphore)

1. 概念

  1. 信号量是一种资源
  2. 信号量只能完成四种操作:初始化、销毁、申请、释放
  3. 如果信号量资源数为0,申请资源会阻塞等待,直到占用资源的任务释放资源,资源数不为0才能申请到资源并继续向下执行
  4. 释放资源不会阻塞

2. 函数接口

函数名原型功能参数说明返回值
sem_initint sem_init(sem_t *sem, int pshared, unsigned int value)初始化信号量

sem

信号量变量地址
pshared

0 表示线程间共享,非 0 表示进程间共享
value

初始资源数量

成功返回 0

失败返回 - 1

sem_destroyint sem_destroy(sem_t *sem)销毁信号量

sem

信号量变量地址

成功返回 0

失败返回 - 1

sem_waitint sem_wait(sem_t *sem)申请信号量(P 操作)

sem

信号量变量地址

成功返回 0(资源数 - 1)

失败返回 - 1;资源数为 0 时阻塞

sem_postint sem_post(sem_t *sem)释放信号量(V 操作)

sem

信号量变量地址

成功返回 0(资源数 + 1)

失败返回 - 1

注意:
  • 申请信号量会让信号量资源数-1
  • 如果信号量资源数为0,则会阻塞等待,直到有任务释放资源,才能拿到资源并继续向下 执行

3. 应用场景

  • 控制并发访问数量(如限制同时访问共享内存的线程数)
  • 实现线程间的同步(如生产者 - 消费者模型中控制数据读写顺序)

注意:

  1. 互斥锁与信号量的区别
  • 互斥锁:用于 "独占" 资源(资源数固定为 1),解决资源竞争
  • 信号量:用于 "计数" 资源(资源数可自定义),控制并发数量或同步

     2.临界区设计原则

  • 临界区代码应尽可能精简,仅包含对共享资源的操作,减少线程等待时间,提高效率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919050.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919050.shtml
英文地址,请注明出处:http://en.pswp.cn/news/919050.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【学习笔记】JVM GC回收机制

1.三种基本的垃圾回收算法 1>标记-清除法 ①先将从树根开始,可以到达的对象标记为可达(JVM中的对象们存储为一颗树) ②将没有标记的对象清除掉 缺点:会产生大量内存碎片 2>复制算法(新生代) ①先将a区…

软件的终极:为70亿人编写70亿个不同的软件

这是个脑洞大开的想法。昨天晚上,我在用Claude code帮我写一个小工具,用来管理我本地那些乱七八糟的文档。写着写着,突然意识到一个问题:这个工具完全是按照我的工作习惯定制的——我喜欢用Markdown,习惯把TODO放在文件…

LakeHouse--湖仓一体架构

大家可能发现了,近些年湖仓一体数据架构被提及的频率越来越高。各家大厂也有湖仓一体架构的实践,也有很多公开分享。 那什么是湖仓一体?为什么出现了湖仓一体架构,换言之,它解决了以前数据仓库、数据湖+数仓两层架构所不能解决的什么问题? 本文会从数仓、数据湖依次介绍…

基于FPGA的实时图像处理系统(1)——SDRAM回环测试

SDRAM回环设计 文章目录SDRAM回环设计一、SDRAM简介1、引脚2、内部结构框图3、操作指令二、系统设计三、实现流程1、SDRAM接口2、FIFO设置3、内部SDRAM的控制模块4、其他四、实现效果五、总结六、代码1、top2、sdram_top3、sdram_ctrl一、SDRAM简介 SDRAM英文全称“Synchronou…

一键检测接口是否存活:用 Python/Shell 写个轻量级监控脚本

网罗开发(小红书、快手、视频号同名)大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方…

优秀工具包-Hutool工具详解

优秀工具包-Hutool工具详解 课程概述 Hutool简介 定位: 小而全的Java工具库,简化开发流程。对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装。 核心优势:零依赖、高性能、中文网页完善。 应用场景:Web开发、数…

《深度解构:构建浏览器端Redis控制台的WebSocket协议核心技术》

Redis作为高性能的内存数据库,其原生客户端多依赖命令行或桌面应用,而浏览器端控制台的缺失,成为制约Web化管理的关键瓶颈,WebSocket协议的出现,打破了HTTP协议单向通信的局限,为浏览器与Redis服务之间建立持久、双向的实时连接提供了可能。本文将从协议本质、交互逻辑、…

Pushgateway安装和部署,以及对应Prometheus调整

目录Pushgateway简介安装验证Prometheus的配置:其它命令Pushgateway简介 Pushgateway 是 Prometheus 生态系统中的一个组件。主要特点是推送而非拉取:Prometheus 默认采用拉取(pull)模式收集指标,但 Pushgateway 允许…

JAVA面试汇总(四)JVM(一)

久违的重新写了一篇面试汇总的,关于JVM的一篇,一共三篇,今天写了第一篇,继续重新学习,重新卷起来,come on baby 1.什么情况下会触发类的初始化? (1)首先是类未被初始化时…

Agent中的memory

rag系列文章目录 文章目录rag系列文章目录前言一、Memory机制作用二、memory分类三、langgraph实践总结前言 众所周知,大模型是无状态的。但是基于大模型的agent一般是有状态的,也就是它有记忆功能。在AI Agent框架中,Memory机制是核心组件之…

AI与IT从业者的未来:替代焦虑还是协作革命?

​​引言:技术渗透与核心命题​​2025年,人工智能技术已从实验室走向产业核心。国务院《关于深入实施“人工智能”行动的意见》推动AI在医疗、制造、金融等领域的规模化落地,全球AI应用用户规模突破2.3亿,生成式AI工具渗透率达16.…

手机版碰一碰发视频系统批量剪辑功能开发,支持OEM贴牌

引言在当今短视频盛行的时代,视频内容的快速生产与分享变得愈发重要。手机版碰一碰发视频系统,借助 NFC 等近场通信技术,实现了便捷的数据交互与视频分享,而在此基础上集成的批量剪辑功能,更是为内容创作者和商家带来了…

Spring AMQP如何通过配置文件避免硬编码实现解耦

在使用Spring AMQP基于注解声明监听者时,可通过抽取常量来避免硬编码:RabbitListener(bindings QueueBinding(exchange Exchange(MQConstant.USER_EXCHANGE),value Queue(MQConstant.USER_QUEUE),key MQConstant.USER_REDIS_BINDING))public void de…

解决zabbix图片中文乱码

要把 Zabbix 前端字体替换为 simkai.ttf(楷体,解决乱码常用),按以下步骤操作:1. 确认 simkai.ttf 路径 先找到系统里 simkai.ttf 字体文件,若没有,可从 Windows 系统(C:\Windows\Fon…

实例分割-动手学计算机视觉13

介绍 实例分割(instance segmentation)的目的是从图像中分割出每个目标实例的掩模(mask)。与语义分割相比,实例分割不但要区分不同的类别,还要区分出同一种类别下的不同目标实例。如图13-1所示 语义分割的结果中,不同的羊对应的标签是一样的…

水环境遥感分析!R语言编程+多源遥感数据预处理;水体指数计算、水深回归分析、水温SVM预测、水质神经网络建模及科研级可视化制图

系统性地整合R语言编程、遥感数据处理及机器学习建模,涵盖水线提取(水体指数与阈值法)、水深反演(多元回归)、水温预测(支持向量机)、水质评估(神经网络)等核心内容&…

微信公众号/小程序百万级OpenID自动化获取工具

摘要 本报告详细阐述了微信用户列表数据获取与处理工具的设计思路,包括分页处理机制、频率控制策略、断点续传功能和分布式存储方案。针对微信API调用限制和用户数据规模特点,该工具旨在高效、安全地获取和存储微信用户列表数据,同时严格遵守微信API调用频率限制,确保系统…

物联网系统中传感器到网关到物联网平台的传输路径、协议、原理、用途与架构详解

摘要物联网(IoT)系统通过传感器、网关和物联网平台实现数据的采集、传输、处理和应用。本文详细分析了传感器到网关再到物联网平台的传输路径,涵盖直接连接、网关中继、边缘计算、多级网关和混合路径五种方式;介绍了短距离&#x…

SpringBoot自动注入配置类初步实现

一.SpringBoot自动装配SpringBoot 的 自动装配(Auto-Configuration) 是它的核心特性之一,它让开发者可以 "开箱即用",避免手动配置大量的 XML 或 Java Config。它的核心思想是:"约定优于配置"&…

直播预告|鸿蒙生态中的AI新玩法

想知道鸿蒙生态里 AI 能玩出啥新花样? 8 月 14 日(周四)20:00 ,「开发者・面对面 坚果派特辑 —— 鸿蒙生态中的 AI 新玩法」直播来袭! 🔍 直播亮点抢先看 AI赋能鸿蒙产品开发:将分享如何利用AI…