news 2026/8/10 20:10:30

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入浅出 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);
    • pshared0 表示线程间共享(最常用),非 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)。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/11 12:34:35

nodejs+vue超能驾校线上学习管理系统的设计与实现_82fsoq6e

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 同行可拿货,招校园代理 nodejsVue超能驾校线上学习管理系统的设计与实现_82fsoq6…

作者头像 李华
网站建设 2026/8/10 3:43:07

set_exception_handler的工作流程的庖丁解牛

set_exception_handler() 是 PHP 中用于捕获未被捕获的异常&#xff08;uncaught exceptions&#xff09; 的核心机制。它的存在使得我们可以在异常“逃逸”出整个调用栈、导致脚本致命终止前&#xff0c;介入处理、记录日志、返回友好错误页面。一、核心定义&#xff1a;它做什…

作者头像 李华
网站建设 2026/8/10 23:59:39

vue和springboot框架开发的幼儿园管理系统_xfxm3eqe

文章目录 具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 同行可拿货,招校园代理 vuespringboot_xfxm3eqe 框架开发的幼儿园管理系…

作者头像 李华
网站建设 2026/8/11 2:34:53

OpenBB:开启金融数据开源新纪元,技术革新引领未来投资风向

摘要&#xff1a; 在金融科技日新月异的今天&#xff0c;OpenBB作为首个开源的金融数据平台&#xff0c;正以颠覆性的姿态重塑金融数据分析的格局。本文深入剖析OpenBB的技术架构、数据集成能力、AI智能应用以及其对企业级用户的创新贡献&#xff0c;旨在为金融分析师、量化交易…

作者头像 李华
网站建设 2026/8/10 15:45:05

计算机毕设java代驾服务 基于Java的智能代驾服务平台设计与实现 Java驱动的代驾服务管理系统开发

计算机毕设java代驾服务jfesz9&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着信息技术的飞速发展&#xff0c;代驾服务行业迎来了新的机遇与挑战。传统的代驾服务管理方式因…

作者头像 李华
网站建设 2026/8/9 23:01:24

YOLOv11涨点改进 | 全网独家创新首发、细节涨点篇 | TGRS 2025顶刊 | 引入 Hint 先验特征提示模块,突出潜在目标区域,缓解红外小目标特征丢失,即插即用万能模块,助力高效涨点

一、本文介绍 🔥本文给大家介绍使用 Hint 先验特征提示 思想引入 YOLOv11 目标检测框架,可以在检测前端为网络提供显式的先验提示信息,使模型在特征提取初期就重点关注潜在目标区域,从而缓解小目标在 Backbone 早期下采样过程中易被淹没和丢失的问题。Hint 基于局部对比与…

作者头像 李华