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

信号量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.lryc.cn/news/450315.html

相关文章:

  • 828华为云征文 | 基于华为云Flexus云服务器X搭建部署——AI知识库问答系统(使用1panel面板安装)
  • 从零预训练一个tiny-llama#Datawhale组队学习Task2
  • 【Linux探索学习】第二弹——Linux的基础指令(中)——夯实基础第二篇
  • Python和QT哪个更适合嵌入式方向的上位机开发?
  • Unity实战案例全解析:RTS游戏的框选和阵型功能(5)阵型功能 优化
  • Android compose 的基本环境搭建
  • git | 合并 commit 的两种方法
  • Grafana链接iframe嵌入Web前端一直跳登录页面的问题记录
  • 后端Java-SpringBoot整合MyBatisPlus步骤(超详细)
  • 8609 哈夫曼树
  • docker的harbor仓库登录问题
  • ENV | docker 安装使用(简单实操版)
  • 【Golang】深入解读Go语言中的错误(error)与异常(panic)
  • DMDSC更换DCR和VOTE磁盘
  • 国产化框架PaddleYOLO结合Swanlab进行作物检测
  • Linux编译部署PHP环境
  • Win11禁止搜索栏查找互联网内容
  • dig和nmap的区别
  • 无人机飞手入伍当兵技术优势分析
  • [Everything] 文件搜索工具的下载及详细安装使用过程(附有下载文件)
  • HIRI-ViT:使用高分辨率输入的视觉Transformer扩展
  • TI DSP TMS320F280025 Note15:串口SCI的使用
  • [Bandzip] 文件解压工具的下载及详细安装使用过程(附有下载文件)
  • 微服务MongoDB解析部署使用全流程
  • string为什么存储在堆里
  • Python和C++及MATLAB距离相关性生物医学样本统计量算法及数据科学
  • 【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
  • golang学习笔记20-面向对象(二):方法与结构体【重要】
  • 广州C++信奥老师解一本通题 1919:【02NOIP普及组】选数
  • cas5.3统一登录前后端分离改造方案(源码)