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

深入浅出 Linux 多线程编程:信号量 (Semaphore) 详解与实战

各类资料学习下载合集
链接:https://pan.quark.cn/s/7c8c391011eb

在多线程编程的世界里,同步机制是保证数据一致性的基石。我们熟知互斥锁(Mutex)、条件变量(Condition Variable),但还有一位“低调的强者”——信号量(Semaphore)。

很多初学者容易被名字误导,以为信号量和“信号(Signal)”有什么亲戚关系。今天我们就依据一份详实的课堂笔记,来彻底搞懂信号量,并手写一个经典的生产者-消费者模型。

01. 核心概念:张三与张三丰

首先,我们需要通过一个经典的段子来厘清概念:

信号量 (Semaphore) 与 信号 (Signal) 的关系,就像“张三”和“张三丰”的关系——名字虽然像,但二者完全无关。

  • 信号 (Signal):是进程间通信机制,比如kill -9发送的信号。
  • 信号量 (Semaphore):是多线程/多进程的同步机制。

信号量的本质

你可以把信号量想象成一个计数器,或者一个初始值为 N 的互斥量。

  • 当 N = 1 时:它就是一个互斥锁,一次只允许一个线程访问。
  • 当 N > 1 时:它允许 N 个线程同时访问共享资源。这极大地提高了并发性,不需要像互斥锁那样锁住整个对象,而是允许对数据的部分进行共享。

它的底层是一个结构体sem_t,但在使用逻辑上,你可以把它看作一个整数。

02. 关键 API 速查

信号量的函数都在<semaphore.h>头文件中,编译时需要链接线程库-pthread。所有函数成功返回 0,失败返回 -1 并设置 errno。

  1. 初始化:

    intsem_init(sem_t*sem,intpshared,unsignedintvalue);
    • pshared:0 表示线程间共享(最常用),非 0 表示进程间共享(需配合共享内存)。
    • value:信号量的初始值 N(允许多少线程并发)。
  2. 销毁:

    intsem_destroy(sem_t*sem);
  3. P操作(申请/减减):

    intsem_wait(sem_t*sem);// 值 > 0 则减1并返回;值 = 0 则阻塞等待
  4. V操作(释放/加加):

    intsem_post(sem_t*sem);// 值加1,并唤醒阻塞在等待该信号量的线程
  5. 超时等待:

    intsem_timedwait(sem_t*sem,conststructtimespec*abs_timeout);
    • 注意:这里的abs_timeout是绝对时间(1970年1月1日至今的时间),而不是相对时间(比如“再等3秒”)。这点非常容易踩坑!

03. 实战案例:基于信号量的生产者-消费者模型

单纯讲函数太枯燥,我们直接上代码。生产者-消费者模型是信号量最典型的应用场景。

场景设计

我们构建一个固定大小的仓库(环形队列/数组),利用两个信号量来实现同步:

  1. sem_blank:代表空闲格子的数量。初始值为仓库大小(例如 5)。
http://www.cnnetsun.cn/news/143260.html

相关文章:

  • IPSec小结
  • SAP 中关闭库存期间(MM 物料账期)核心是用MMPV关闭旧期间并打开新期间,配合MMRV控制前期过账权限,同时需完成 FI/CO 等关联模块期间控制与数据校验
  • nodejs+vue电动车租赁平台系统_9jmey8a6
  • Java小白求职面试:从Spring Boot到微服务架构的技术探讨
  • 混合精度训练:FP16与FP32, 借助Tensor Core加速
  • LangChain表达式语言
  • 8MP 环视 / DMS 摄像头,带宽到底有多狠?
  • 【Halcon-2D测量】get_metrology_object_fuzzy_param 函数功能(用于读取计量对象模糊测量参数)
  • 银河距离银河距离银河距离银河距离银河距离
  • 生成式深度学习(用变分自编码器生成图像)
  • 显示器分辨率?【图文详解】显示器分辨率调整?电脑分辨率设置?
  • 基于STM32的智能鞋柜系统设计与实现
  • VBA会被Python代替吗
  • python与nodejs哪个性能高
  • 【含文档+PPT+源码】基于小程序的智能停车管理系统设计与开发
  • Doris的自增列介绍
  • C++编程实践——多线程变量共享问题展开分析
  • 【Android FrameWork】第三十六天:随机数EntropyMixer
  • 介观交通流仿真软件:VISSIM (介观模式)_(16).高级仿真技术
  • 安卓 之 PassthruPatchRecord
  • YOLOv8 训练与检测系统智慧化交通公路上落石检测数据集 智慧道路交通路面障碍物检测数据集 智慧交通、山区公路监控、应急预警平台 YOLOv8 训练与检测系统
  • 基于django智慧农业管理系统设计开发实现
  • Android架构师面试指南:基于跨越速运职位要求的全面解析与参考答案
  • 【2025最新】基于SpringBoot+Vue的企业项目管理系统管理系统源码+MyBatis+MySQL
  • 企业级大学生考勤系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 【2025最新】基于SpringBoot+Vue的物资综合管理系统管理系统源码+MyBatis+MySQL
  • 数学梗图数据集分析报告:999张高质量数学主题幽默图片资源
  • 【毕业设计】SpringBoot+Vue+MySQL 美食信息推荐系统平台源码+数据库+论文+部署文档
  • AI核心知识59——大语言模型之Mamba(简洁且通俗易懂版)
  • SpringBoot+Vue 流浪动物救助平台平台完整项目源码+SQL脚本+接口文档【Java Web毕设】