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

信号量SEM

前提

1.信号量的本质是一把计数器

2.申请信号本质就是预订资源

3.PV操作是原子的!

将一个公共资源当做整体访问-->锁

如果公共资源不当做整体使用,多进程可以并发的访问公共资源,但不是同一个区域,为了将资源均分,所以有了信号量。

我们在申请信号量,预订了某个区域的资源,我们需要判断资源是否准备就绪吗?

不需要?我们只要申请成功,这份资源就只属于我,可以直接使用

认识接口

初始化

第一个参数可以设置为全局或者局部

第二个参数是决定是否在线程间共享还是在进程间共享

第三个参数为资源个数

P操作

 

V操作

发布信号量

 

销毁

 

基于环形队列的CP问题

 

生产者生产一个,往后走一个,直到走到消费者的前一格,此时不能往前走,因为会覆盖自己历史的数据  

因此:

消费者不能超过生产者,生产者不能把消费者超过一个圈。

我们只需要在以下两种场景生产者和消费者会指向同一个位置:

两种情况需要判断

1.全空

2.全满

资源的认识:p——>空间  c——>数据

p:sem-space c :sem_data

要满足以上四点,我们只需要用信号量去实现,他会帮我们申请资源并对资源做管理,我们只需要初始化好它、

   

 

 

值得一提的是RingQueue队列多生产多消费问题?

单生产者单消费者RingQueue能不能不做修改就实现多生成多消费,答案是不行

 

因为信号量是对资源进行分块管理,一个线程只能访问某一个分块资源,也就是说这个信号量保护的仅仅是空间资源和数据资源,但是_p_pos和_c_pos他们没有被保护起来,可能造成数据错乱的问题。

如何解决?

加锁

 

为什么锁是加在申请信号量之后?

申请信号量是原子性的,是不需要被锁保护的,锁维护的临界区越大,效率其实越低,如果加在申请信号量之前,那么多消费者或多生产者在进入函数后,就不能同时去申请信号量,造成效率降低。


http://www.kler.cn/news/327372.html

相关文章:

  • 淘宝商品详情API接口多线程调用:解锁数据分析行业的效率新篇章
  • Linux防火墙配置绿色端口,解决无法访问java服务的问题
  • LINUX下的驱动开发三
  • window系统下nginx管理脚本
  • 【数据库】深入解析 MongoDB 数据库语法
  • 《OpenCV 计算机视觉》—— 视频背景建模
  • 【React】react hooks的使用规则
  • 基于深度学习的持续的知识积累与转移
  • golang学习笔记19-面向对象(一):面向对象的引入
  • 9.30学习
  • 南沙C++信奥赛陈老师解一本通题: 1963:【13NOIP普及组】小朋友的数字
  • Redis 性能优化的高频面试题及答案
  • HAProxy 安全配置
  • 正则表达式中的贪婪模式和非贪婪模式
  • [大语言模型-论文精读] 大语言模型是单样本URL分类器和解释器
  • 相互作用的检索增强 3D 分子生成扩散模型 - IRDiff 评测
  • 滚雪球学MySQL[5.1讲]:事务与并发控制
  • 如何使用ssm实现钢铁集团公司安全管理系统的构建与实现
  • 基于小步大步法(BSGS)的同态加密多项式求值
  • 滚雪球学Oracle[2.1讲]:Oracle数据库安装与配置
  • 新品上市!智能无线接入型路由器ZX7981EP,WIFI6技术双频频段
  • 解锁微信小程序新技能:ECharts动态折线图搭配WebSocket,数据刷新快人一步!
  • 数据库 - Mongo数据库
  • 第166天:应急响应-拒绝服务钓鱼指南DDOS压力测试邮件反制分析应用日志
  • ubuntu server 常用配置
  • Spring面试内容大纲
  • ios内购支付-支付宝APP支付提现
  • 互联网前后端分离的开发场景,一般会员和数据权限的判断是放在前端还是后端?
  • 【08】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-Scroll容器与Tabs组件
  • 大屏娱乐体验新标杆:海信发布全新一代AI电视