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

ZLToolKit 源码分析(二):线程同步原语 semaphore 与 onceToken

高并发框架的基石是同步原语。本文逐行分析 ZLToolKit 自研的 semaphore(信号量)和 onceToken(RAII 守卫),揭示其如何用 C++11 标准库实现高效且安全的线程同步。

1. 为什么不用 std::semaphore?

C++20 才引入std::counting_semaphore,而 ZLToolKit 基于 C++11 开发,必须自研。其实现基于std::condition_variable+std::mutex,语义等价于std::counting_semaphore

2. semaphore 源码全解

文件:src/Thread/semaphore.h

2.1 完整源码

classsemaphore{public:semaphore(size_t initial=0){_count=initial;}// V 操作:释放信号量voidpost(size_t n=1){std::lock_guard<std::mutex>lock(_mutex);_count+=n;if(n>1){_condition.notify_all();}else{_condition.notify_one();}}// P 操作:获取信号量(阻塞)voidwait(){std::unique_lock<std::mutex>lock(_mutex);while(_count==0){_condition.wait(lock);}--_count;}private:size_t _count;std::mutex _mutex;std::condition_variable _condition;};

2.2 逐行精析

post() — 释放信号量
voidpost(size_t n=1){std::lock_guard<std::mutex>lock(_mutex);// RAII 加锁_count+=n;// 增加计数if(n>1){_condition.notify_all();// 释放多个,唤醒所有等待者}else{_condition.notify_one();// 释放一个,只唤醒一个}}

关键设计:

  • n > 1时用notify_all()——因为多个等待者可能都需要被唤醒
  • n == 1时用notify_one()——避免惊群效应(thundering herd)
wait() — 获取信号量
voidwait(){
http://www.rkmt.cn/news/1442404.html

相关文章:

  • 【Agent智能体15 | 工具使用-现代的LLM请求调用工具的语法】
  • 郑州市 高新区 厨卫改造翻新上门施工|维小达厨房改造、卫生间翻新、厨卫防水重做、下水管道改造一站式施工服务 - 维小达科技
  • 2026 广州黄金回收避坑,五家口碑好店,收的顶专业合规排名第一 - 奢侈品回收测评
  • 2026最新济南短视频运营平台排行:5家机构实力实测对比 - 奔跑123
  • 如何掌控你的惠普OMEN游戏本:OmenSuperHub完全使用指南
  • 2026年薪酬设计:这3个公平性原则让团队心服口服
  • 083、医学影像 CT/MRI 窗宽窗位应用不当?DICOM 解析、HU 值映射与多窗显示方案
  • 用Python和Tensorly复现经典PARAFAC论文:从荧光光谱数据到三维张量分解实战
  • 2026 年论文降 AI 工具硬核横评:16 款实测谁在保命谁在毁稿
  • 山东采暖炉品牌排行:实测性能与服务维度客观对比 - 奔跑123
  • [开源] 科室二次分配公平感模拟器:用博弈论算出护士长敢拍板的奖金方案,让夜班、年资、技术难度全进模型
  • NCMconverter:如何轻松解锁网易云音乐NCM格式音频文件
  • 零基础速存!最新 Kali Linux 全套详细教程,从下载安装到上手使用完整指南
  • 纸电路入门:用导电胶带和纽扣电池点亮创意世界
  • Sora 2实时渲染交互瓶颈突破:GPU内存占用降低63%的关键3步调优法(附NVidia CUDA Profile诊断模板)
  • DIY电池电量指示器:从分压原理到三极管开关电路的实践指南
  • 如何快速修复机械键盘连击问题:开源工具的完整解决方案
  • 新手也能懂:IGBT驱动电路里的‘退饱和’到底是什么?用UCC21750和BM6101FV-E2芯片实测讲解
  • 【Sora 2动画短片创作实战指南】:20年AIGC专家亲授5大不可外泄的提示词工程心法
  • 基于Google Charts与树莓派的物联网数据可视化实战
  • 2026广州黄金奢品变现去哪?本地靠谱门店深度测评 - 合扬奢侈品交易中心
  • 保姆级教程:用EB Tresos和S32DS从零搭建AutoSar MCAL基础工程(附完整配置流程)
  • 2026 年论文降 AI 工具横评,早标网为何能实现知网检测零通过率
  • 别再硬训CLIP了!手把手教你用EVA-CLIP的三大技巧,成本减半效果还更好
  • 9V电池驱动LED灯带:从电路原理到安全实操指南
  • 别再傻傻分不清了!用大白话讲明白DDR内存里的Burst和Prefetch到底啥区别
  • 现在不掌握Sora 2新闻视频工作流,半年后将被主流媒体编辑部淘汰?——基于27家央媒/省台HR招聘JD的技能断层预警分析
  • Vivado FPGA开发入门:从VHDL编码到Basys 3板卡下载全流程
  • 电机控制器实战:如何为你的IGBT驱动电路选择合适的退饱和保护芯片?(UCC21750/BM6101FV-E2/1EDI2002AS对比)
  • DIY红外遥控测试器:基于TSOP1738的电路设计与实践