C++ 使用共享内存的进程通信方式模拟生产者消费者模型

编码环境如下

系统环境:linux

信号量:使用Linux操作系统的SystemV信号量

生产者代码如下

#include <iostream>
#include <sys/sem.h>
#include <sys/shm.h>
#include <string.h>#define SEM_KEY 0x5678
#define SHM_KEY 0xABCD
#define SHM_SIZE 1024union semun{int         val;struct semid_ds* buf;unsigned short *array;
};int main()
{key_t sem_key = SEM_KEY;key_t shm_key = SHM_KEY;char*  shm_ptr = NULL;int sem_id = 0;int shm_id = 0;//sem createsem_id = semget(sem_key,1,IPC_CREAT |0666);if(-1 == sem_id){printf("semget error\n");return -1;}//sem initunion semun arg;arg.val = 1;if(semctl(sem_id,0,SETVAL,arg) == -1){printf("semctl error\n");return -1;}//create shmshm_id = shmget(shm_key,SHM_SIZE,IPC_CREAT|0666);if(-1 == shm_id){printf("shmget error\n");return -1;}static int cnt = 0;std::string data;while (true) {static struct sembuf op;//P操作op.sem_num = 0; //信号在信号集中索引,0代表第一个信号op.sem_op = -1; // P操作:sem_op = -1op.sem_flg = SEM_UNDO;if(semop(sem_id,&op,1) == -1){printf("semop wait error\n");return -1;}if(cnt > 10000000){cnt = 1;}data = "Data context: " + std::to_string(cnt++);// 将当前进程与共享内存shmid建立链接,获取共享内存地址shm_ptr = (char*)shmat(shm_id,nullptr,0);if(shm_ptr == (char*)-1){   //获取共享内存映射地址失败printf("shmat error\n");return -1;}memcpy(shm_ptr,data.c_str(),data.size() + 1);printf("Producer product Data: %s\n",shm_ptr);shmdt(shm_ptr);//V操作op.sem_num = 0; //信号在信号集中索引,0代表第一个信号op.sem_op = 1; // V操作:sem_op = 1op.sem_flg = SEM_UNDO;if(semop(sem_id,&op,1) == -1){printf("semop post error\n");return -1;}}return 0;
}

消费者代码如下:

#include <iostream>
#include <sys/sem.h>
#include <sys/shm.h>#define SEM_KEY 0x5678
#define SHM_KEY 0xABCD
#define SHM_SIZE 1024union semun{int         val;struct semid_ds* buf;unsigned short *array;
};int main()
{key_t sem_key = SEM_KEY;key_t shm_key = SHM_KEY;char*  shm_ptr = NULL;int sem_id = 0;int shm_id = 0;//sem createsem_id = semget(sem_key,1,IPC_CREAT |0666);if(-1 == sem_id){printf("semget error\n");return -1;}//sem initunion semun arg;arg.val = 1;if(semctl(sem_id,0,SETVAL,arg) == -1){printf("semctl error\n");return -1;}//create shmshm_id = shmget(shm_key,SHM_SIZE,IPC_CREAT|0666);if(-1 == shm_id){printf("shmget error\n");return -1;}while (true) {static struct sembuf op;op.sem_num = 0; //信号在信号集中索引,0代表第一个信号op.sem_op = -1; // P操作:sem_op = -1op.sem_flg = SEM_UNDO;if(semop(sem_id,&op,1) == -1){printf("semop wait error\n");return -1;}shm_ptr = (char*)shmat(shm_id,nullptr,0);if(shm_ptr == (char*)-1){   //获取共享内存映射地址失败printf("shmat error\n");return -1;}printf("Customer Get Data: %s\n",shm_ptr);shmdt(shm_ptr);//op.sem_num = 0; //信号在信号集中索引,0代表第一个信号op.sem_op = 1; // V操作:sem_op = 1op.sem_flg = SEM_UNDO;if(semop(sem_id,&op,1) == -1){printf("semop post error\n");return -1;}}return 0;
}

运行结果如下:

附加链接如下:

 进程间通信方式介绍_夜雨听萧瑟的博客-CSDN博客

 C++ 创建共享内存_c共享内存_夜雨听萧瑟的博客-CSDN博客

 信号量SytemV与Posix信号量的介绍与用法_夜雨听萧瑟的博客-CSDN博客

 C++信号量与共享内存实现进程间通信-CSDN博客

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

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

相关文章

适用于 Windows 的 10 个顶级 PDF 编辑器 [免费和付费]

曾经打开PDF文件&#xff0c;感觉自己被困在数字迷宫中吗&#xff1f;无法编辑的文本、无法调整大小的图像以及签署感觉像是一件苦差事的文档&#xff1f;好吧&#xff0c;不用再担心了&#xff01;本指南解开了在 Windows 上掌握 PDF 的秘密&#xff0c;其中包含 10 款适用于 …

图数据库Neo4J入门——Neo4J下载安装+Cypher基本操作+《西游记》人物关系图实例

这里写目录标题 一、效果图二、环境准备三、数据库设计3.1 人物节点设计3.2 关系设计 四、操作步骤4.1 下载、安装、启动Neo4J服务4.1.1 配置Neo4J环境变量4.1.2 启动Neo4J服务器4.1.3 启动Ne04J客户端 4.2 创建节点4.3 创建关系&#xff08;从已有节点创建关系&#xff09;4.4…

即插即用模块详解SCConv:用于特征冗余的空间和通道重构卷积

目录 一、摘要 二、创新点说明 2.1 Methodology 2.2SRU for Spatial Redundancy​编辑 2.3CRU for Channel Redundancy 三、实验 3.1基于CIFAR的图像分类 3.2基于ImageNet的图像分类 3.3对象检测 四、代码详解 五、总结 论文&#xff1a;https://openaccess.thecvf.c…

全网短剧搜索源码+短剧API接口 短剧下载 热门短剧 全开源可二开

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 pc端h5手机端全网短剧搜索前端源码分享 内含7000短剧资源(不支持在线播放&#xff09; 搜索API接口&#xff1a;文件内查看 全部短剧API接口&#xff1a;文件内查看 每日更新API接…

【【相机运动】_Camera_shake镜头晃动动画】

【相机运动】:Camera shake镜头晃动动画 2022-07-20 20:28 评论(0)

【ROS2】搭建ROS2-Humble + Vscode开发流程

【ROS2】搭建ROS2-Humble Vscode开发流程 文章目录 【ROS2】搭建ROS2-Humble Vscode开发流程1.基本环境配置2.搭建Vscode开发环境 1.基本环境配置 基本的环境配置包括以下步骤&#xff1a; 安装ROS2-Humble&#xff0c;可以参考这里安装一些基本的工具&#xff0c;可以参考…

顺序表(快速上手数据结构)

在介绍ArrayList之前, 我们需要先了解List. List是一个接口,它继承于Collection接口(Collection又继承于最顶层的接口Iterable). 从数据结构的角度来看,List就是一个线性表(Linear List),即n个具有相同类型元素的有限序列, 在该序列上可以执行增删查改等操作. 注意: List是一…

BetterDisplay Pro for Mac 显示器校准和优化软件

BetterDisplay Pro for Mac是一款适用于Mac电脑的显示器校准和优化软件。它可以帮助用户校准显示器的颜色、亮度、对比度和伽马值等参数&#xff0c;使得显示器更加准确和清晰&#xff0c;提高用户的工作效率。 BetterDisplay Pro for Mac v2.0.11激活版下载 这款软件具有直观的…

cesium primitive 移动 缩放 旋转 矩阵

旋转参考&#xff1a;cesium 指定点旋转rectangle Primitive方式 矩阵篇-CSDN博客 平移参考&#xff1a;cesium 调整3dtiles的位置 世界坐标下 相对坐标下 平移矩阵-CSDN博客 一、primitive方式添加polygon let polygonInstance new Cesium.GeometryInstance({geometry: Ce…

快速入门Spring Data JPA

Spring Data JPA是Spring Data框架的一小部分&#xff0c;它能够让开发者能够更加简单的对数据库进行增删改查。 由于Spring Data JPA可以自动生成SQL代码所以一般情况下&#xff0c;简单的增删查改就可以交给Spring Data JPA来完成&#xff0c;而复杂的动态SQL等用MyBatis来完…

分类损失函数与评估指标

目录 1 评估指标 1.1 准确率 1.2 精确率 1.3 召回率 1.4 F1 score 1.5 ROC曲线 1.6 AUC 1.7 PRC曲线的优势 2 损失函数 1. 负对数似然损失 2. 交叉熵损失 3. 指数损失 3 分类问题为什么用交叉熵损失不用 MSE 损失 1 评估指标 混淆矩阵 TP(True Positive) ---- 正…

xxl-job使用自动注册节点,ip不对,如何解决????

很明显这时我们本机的ip和我们xxl-job自动注册的ip是不一致的&#xff0c;此时该如何处理呢&#xff1f;&#xff1f;&#xff1f;&#xff1f; 方法一&#xff1a;在配置文件中&#xff0c;将我们的ip固定写好。 ### xxl-job executor server-info xxl.job.executor.ip写你的…