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);
}

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/30773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

羊毛群的商业逻辑

前言 近几个月&#xff0c;同事们在用餐时偶尔会分享一些群分享的领券链接。 起初&#xff0c;这引起了我一些疑惑。经过一番了解&#xff0c;我发现这个看似充满优惠的社群&#xff0c;实则是一个展现商业智慧的舞台。 在这里&#xff0c;商家找到了一个有效的营销渠道&…

OpenCV--Mat属性和深浅拷贝

Mat属性和深浅拷贝 代码和笔记 代码和笔记 import cv2 import numpy as np""" Mat属性 dims:维度 rows:行数 cols:列数 depth:像素的位深 channels:通道数 RGB 3 size:矩阵大小 type:类型 data:存放数据Mat的深浅拷贝-在python中即ndarray的深浅拷贝 "&qu…

第四届人工智能、机器人和通信国际会议(ICAIRC 2024)

第四届人工智能、机器人和通信国际会议&#xff08;ICAIRC 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Robotics, and Communication 2024年12月27-29日 | 中国厦门 重要信息 会议官网&#xff1a;www.icairc.net 录用通知时间&…

▶《强化学习的数学原理》(2024春)_西湖大学赵世钰 Ch1 基本概念

PPT 截取有用信息。 课程网站做习题。总体 MOOC 过一遍 1、视频 学堂在线 习题 2、相应章节 过电子书 复习 3、总体 MOOC 过一遍 学堂在线 课程页面链接 中国大学MOOC 课程页面链接 B 站 视频链接 PPT和书籍下载网址&#xff1a; 【github链接】 onedrive链接&#xff1a; 【…

基于低代码开发平台的科技管理系统构建:简化运维,提升效率

随着科技的发展&#xff0c;企业对管理系统的需求日益增长。为了满足这一需求&#xff0c;本文介绍了一种基于低代码开发平台的科技管理系统构建方法。通过简化开发流程、提高运维效率&#xff0c;该系统能够帮助企业实现科技管理的高效运作。 引言 在当今信息化时代&#xff0…

Python4 操作MySQL数据库

通过python的pymysql库连接到本地的MySQL数据库&#xff0c;并执行查询操作来获取数据&#xff0c;然后打印出每一行的数据&#xff0c;这里以一个简单的学生表为例进行介绍。 1. MySQL的安装与数据准备 首先需要安装MySQL&#xff0c;在安装完成之后使用Navicat与本地数据库…

Docker 部署项目,真的太雅了~

大家好&#xff0c;我是南城余&#xff01; 最近在找工作&#xff0c;正好手里有台服务器&#xff0c;之前项目上线用的宝塔部署项目上线&#xff0c;在公司实习了一年后&#xff0c;发现如今项目部署都使用的是容器化部署方案&#xff0c;也就是类似于和 Docker 一样的部署方案…

对于图片转3d人脸方面的研究

1.一个开源的可以运行的项目&#xff08;face3d/README.md at master yfeng95/face3d GitHub&#xff09; 在配置好环境后&#xff0c;让我们一个一个py文件运行它&#xff08;我将给出中文注释&#xff09; 1&#xff09;1_pipeline.py 将一个3d头像的mat文件转换为jpg…

海外仓系统能解决海外仓哪些难题?海外仓标准化管理实用指南

海外仓管理问题常常导致业务流程变慢&#xff0c;根据我们的调查显示&#xff0c;至少有48%的海外仓每周都会出现一些“小意外”。甚至这些小问题每天都在发生&#xff0c;问题的出现已经严重影响到了海外仓业务的进行。今天我们将重点分析海外仓比较常见的一些问题&#xff0c…

springboot vue 开源 会员收银系统 (7) 收银台的完善 新增开卡 结算

前言 完整版演示 开发版演示 在前面的开发中&#xff0c;我们成功完成了商品分类和商品信息的搭建&#xff0c;开发了收银台基础。现在&#xff0c;我们将进一步完善收银台的功能&#xff0c;添加开卡和结算功能&#xff0c;并在后台实现会员卡的创建和订单保存。同时&#xff…

使用 Monkey Patch 解决 Sahi 可视化的中文乱码问题

其实如果是对算法的输出结果进行可视化的话&#xff0c;使用 Pillow 库是完全没有问题的。但是存在着这样一种情况&#xff0c;我们调用的公共包当中&#xff0c;里面已经有了可视化的接口&#xff0c;但是使用的是 OpenCV 中的 cv2.putText 进行可视化的。正常来说&#xff0c…

地瓜网络技术综合助手教你一键下载腾讯会议高清视频

当您错过腾讯会议的直播课程&#xff0c;不必担心&#xff0c;地瓜网络技术综合助手帮您轻松获取视频回放。 只需几个简单步骤&#xff0c;即可在手头保留珍贵的学习资料。 首先&#xff0c;启动地瓜网络技术综合助手&#xff0c; 进行软件初始化并开启监测功能。 接下来&…

智慧乡村和美人家信息化系统

一、简介 智慧乡村和美人家信息化系统是一个综合管理平台&#xff0c;集成了首页概览、一张图可视化、数据填报、智能评估、便捷申报、公开公示、任务管理、活动发布和灵活配置等功能。该系统不仅提升了乡村管理效率&#xff0c;也优化了家庭生活的便捷性。通过一张图&#xf…

BEVM背靠比特大陆打造新赛道,算力RWA成下一个千亿市场?

众所周知&#xff0c;在加密行业&#xff0c;每隔一段时间就会有一个新的概念或者一个新词出现&#xff0c;并引来社区和资本的追捧关注&#xff0c;笔者近期在浏览新闻时&#xff0c;发现了一个特别有意思的新概念——算力RWA&#xff0c;在社区引起了不少讨论。 该词最早出现…

工时管理系统的优势及推荐

企业发展离不开每一个员工&#xff0c;而员工的工作效率高低也是影响着企业在行业内的竞争力&#xff0c;所以规范管理员工时间&#xff0c;提升员工工作效率势在必行。工时管理系统在现代企业中的应用越来越广泛&#xff0c;不仅是因为它能显著提高企业管理效率&#xff0c;更…

Flutter【组件】按钮

简介 flutter 按钮组件。提供一种封装按钮组件的思路&#xff0c;并不支持过多的自定义属性。根据使用场景及设计规范进行封装&#xff0c;使用起来比较方便。 github地址&#xff1a;https://github.com/ThinkerJack/jac_uikit pub地址&#xff1a;https://pub.dev/package…

IOS 关于Apple Pay 与内购

一、什么是Apple Pay、什么是内购 首先这两个不是一样的&#xff0c;很多人一看觉得这两是一回事&#xff0c;我之前也是这么想的。今天我来给大家阐述一下&#xff1a; Apple Pay&#xff1a;是指支付实物类。类似国内的微信、支付宝。支付超市食品类啥的。 内购&#xff1…

el-upload组件校验不通过预览列表依然显示图片问题解决

如图校验不通过的图片依然显示在预览列表了&#xff0c;需要在校验不通过的时候移除图片 <el-uploadclass"upload-cls":action"ossSignature.host":auto-upload"false"ref"upload":list-type"listType":limit"limi…

如何在React中使用CSS模块,并解释为什么使用它们比传统CSS更有益?

在React中使用CSS模块是一种将CSS类名局部化到单个组件的方法&#xff0c;从而避免了全局作用域中的类名冲突。CSS模块允许你为组件编写样式&#xff0c;并确保这些样式只应用于该组件&#xff0c;而不会影响到其他组件。 以下是在React中使用CSS模块的步骤&#xff1a; 安装C…

通过CSS样式来禁用href

<style>.disabled-link {pointer-events: none;cursor: default;text-decoration: none;color: inherit; }</style><a href"https://www.example.com" class"disabled-link">禁用链接</a> 在上述CSS样式中&#xff0c; pointer-…