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

opencv 打开图片后,cv::mat存入共享内存的代码,如何设置队列?

参考

https://blog.csdn.net/BrilliantAntonio/article/details/120606129

分析

  • 执行Add操作时,随机产生一个大写英文字母模拟产品,放入缓冲区,同时调整队尾指针end.
  • 执行Remove操作时,将当前缓冲区资源清空,同时调整队首指针start.
#define SEMKEY 123
#define SHMKEY 456
#define BUFNUM 10
#define SEMNUM 3/// main /
struct Buffer
{int start, end;char buffer[BUFNUM];
};void Add(struct Buffer *shm)
{char product = 'A' + rand() % 26;printf("producer %d: added product %c into buffer:\t", getpid(), product);shm -> buffer [shm -> end] = product;shm -> end = (shm -> end + 1) % BUFNUM;printf("|%s|\n", shm -> buffer);
}void Remove(struct Buffer *shm)
{char product = shm -> buffer [shm -> start];printf("consumer %d: removed product %c from buffer:\t", getpid(), product);shm -> buffer [shm -> start] = ' ';shm -> start = (shm -> start + 1) % BUFNUM;printf("|%s|\n", shm -> buffer);
}

这两个函数 AddRemove 是模拟生产者-消费者问题中的两个基本操作:一个用于向缓冲区添加产品(或数据),另一个用于从缓冲区移除产品。这两个函数都操作一个共享内存(shm),该共享内存应该包含一个缓冲区以及两个索引(startend)来跟踪缓冲区的哪一部分是空的或满的。

下面是对这两个函数的详细解释:

Add 函数

  1. 生成随机产品char product = 'A' + rand() % 26; 这行代码生成一个随机的大写字母(从 ‘A’ 到 ‘Z’)作为模拟的“产品”。
  2. 打印添加操作:使用 printf 打印出生产者进程ID和添加的产品。
  3. 向缓冲区添加产品shm -> buffer [shm -> end] = product; 这行代码将随机生成的产品放入缓冲区的当前结束位置。
  4. 更新结束索引shm -> end = (shm -> end + 1) % BUFNUM; 这行代码更新结束索引以指向下一个空位置。如果 end 已经到达缓冲区的末尾,它会被重置为缓冲区的开始位置(实现循环缓冲区)。
  5. 打印缓冲区内容:最后,printf 打印出整个缓冲区的内容。但这里有一个潜在的问题:缓冲区 shm -> buffer 被当作字符串处理,但缓冲区中可能包含非打印字符(如空格或其他非ASCII字符),这可能导致输出看起来不是预期的那样。

Remove 函数

  1. 获取产品char product = shm -> buffer [shm -> start]; 这行代码从缓冲区的当前开始位置获取产品。
  2. 打印移除操作:使用 printf 打印出消费者进程ID和移除的产品。
  3. 清空开始位置shm -> buffer [shm -> start] = ' '; 这行代码将开始位置的内容设置为空格(或其他非产品字符)。这用于表示该位置现在是空的。
  4. 更新开始索引shm -> start = (shm -> start + 1) % BUFNUM; 这行代码更新开始索引以指向下一个有产品的位置。如果 start 已经到达缓冲区的末尾,它会被重置为缓冲区的开始位置(实现循环缓冲区)。
  5. 打印缓冲区内容:同样,这里打印出整个缓冲区的内容,但可能存在与 Add 函数相同的问题。

注意事项

  • 缓冲区大小BUFNUM 应该是在其他地方定义的一个常量,表示缓冲区的大小。

初始化

    void *temp = NULL;struct Buffer *shm = NULL;temp = shmat(shmId, 0, 0);if(temp == (void *) -1){printf("share memory attachment failed!\n");exit(EXIT_FAILURE);        }shm = (struct Buffer *) temp;shm -> start = 0;shm -> end = 0;for(i = 0; i < BUFNUM; i++){shm -> buffer[i] = ' ';}

使用

第一个信号量为empty,表示缓冲池为空的个数;
第二个信号量为full,表示缓冲池中的产品个数;
第三个信号量为mutex,控制对缓冲池的读取权限。

使用时,

生产者依次刷新 empty(-1)->mutex(-1)->mutex(+1)->full(+1)
消费者依次刷新 full(-1)->mutex(-1)->mutex(+1)->empty(+1)

void Producer(int semId, struct Buffer *shm)
{do{// wait empty region...// wait mutex...Add(shm);// signal mutex...// singal full region...sleep(random() % 2);}while(1);
}void Consumer(int semId, struct Buffer *shm)
{do{// wait full region...// wait mutex...Remove(shm);// signal mutex...// singal empty region......}while(1);
}

总结

这个循环的缓冲器好像也能实现我们的需求

相关文章:

  • C 语言通用MySQL 功能增删查改功能.
  • [Mysql] 的基础知识和sql 语句.教你速成(上)——逻辑清晰,涵盖完整
  • SwaggerSpy:一款针对SwaggerHub的自动化OSINT安全工具
  • NetSuite Inventory Transfer Export Saved Search
  • 安装TensorFlow2.12.0
  • Electron+Vue开源软件:洛雪音乐助手V2.8畅享海量免费歌曲
  • 【Python】从0开始的Django基础
  • 轻量级二维码生成器
  • 银河麒麟4.0.2安装带有opengl的Qt5.12.9
  • 解锁Flutter中的ProcessResult:让外部命令执行变得轻松
  • 机器人----控制方式
  • 深度学习 --- stanford cs231学习笔记五(训练神经网络的几个重要组成部分 二)
  • 开源AGV调度系统OpenTCS中的路由器(router)详解
  • 检查HIVE分区是否连续
  • Python第二语言(十三、PySpark实战)
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • eclipse的离线汉化
  • HTML-表单
  • Invalidate和postInvalidate的区别
  • JAVA 学习IO流
  • JAVA多线程机制解析-volatilesynchronized
  • JS数组方法汇总
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • LeetCode算法系列_0891_子序列宽度之和
  • Meteor的表单提交:Form
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Vue ES6 Jade Scss Webpack Gulp
  • 工程优化暨babel升级小记
  • 好的网址,关于.net 4.0 ,vs 2010
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 检测对象或数组
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 微信小程序--------语音识别(前端自己也能玩)
  • 为视图添加丝滑的水波纹
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 译有关态射的一切
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 阿里云移动端播放器高级功能介绍
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #每天一道面试题# 什么是MySQL的回表查询
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (a /b)*c的值
  • (JS基础)String 类型
  • (办公)springboot配置aop处理请求.
  • (七)Java对象在Hibernate持久化层的状态
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (循环依赖问题)学习spring的第九天
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • **CentOS7安装Maven**
  • .gitignore
  • .gitignore不生效的解决方案
  • .mysql secret在哪_MySQL如何使用索引
  • .Net Core缓存组件(MemoryCache)源码解析