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

server/2024/10/19 23:27:31/

编码环境如下

系统环境: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.ppmy.cn/server/4976.html

相关文章

发挥创意,绘制无限可能:draw.io 使用心得

在如今数字化的时代&#xff0c;图表和流程图已成为了我们生活和工作中不可或缺的一部分。而在选择图表绘制工具时&#xff0c;draw.io 无疑是一个备受推崇的选择。作为一款强大的在线图表工具&#xff0c;draw.io 提供了丰富的功能和易用的界面&#xff0c;使得用户能够轻松地…

Excel高效办公:人力资源管理(AI版)

AI人力资源管理一本通&#xff1a;147个“温馨提示”53个“教您一招”&#xff0c;掌握使用Excel高效完成人力资源管理工作的“心法”&#xff0c;助你早做完、不加班。 一本书掌握人力资源高效管理的“心法”&#xff01; 案例丰富&#xff0c;参考性强&#xff1a;本书不是…

地质灾害监测预警系统:科技守护,构筑智能预警屏障

随着全球气候变化和人为活动的加剧&#xff0c;地质灾害频繁发生&#xff0c;给人们的生命财产安全带来了严重威胁。为了降低地质灾害带来的损失&#xff0c;地质灾害监测预警系统应运而生。本文将为您详细介绍地质灾害监测预警系统的原理、功能以及在实际应用中的效果。一、地…

NLP基础—jieba分词

jieba分词 支持四种分词模式 精确模式 试图将句子最精确地切开,适合文本分析;全模式 把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;搜索引擎模式 在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。paddle模式 利用Paddle…

centos修改启动项加载不同内核

一.背景&#xff1a; 虚拟机中有时需要编译好几个内核版本&#xff0c;make install后系统存在几个内核版本。需要再哪个内核上开发调试就启动特定的内核版本。这就需要修改启动时的内核版本&#xff0c;再物理机或虚拟机启动时可以上下键选择。但有时是docket云环境中或远程时…

高频前端面试题汇总之Vue篇

1. Vue的基本原理 当一个Vue实例创建时&#xff0c;Vue会遍历data中的属性&#xff0c;用 Object.defineProperty&#xff08;vue3.0使用proxy &#xff09;将它们转为 getter/setter&#xff0c;并且在内部追踪相关依赖&#xff0c;在属性被访问和修改时通知变化。 每个组件实…

React + 项目(从基础到实战) -- 第六期

引入ant design ui ui 组件库介绍 组件总览 - Ant Design (antgroup.com) 安装 - Material-UI (mui.com) Tailwind UI - Official Tailwind CSS Components & Templates 引入antd Ant Design of React - Ant Design 常用组件 // 引入antd 美化import { Layout } from a…

解锁棋盘之谜:探索N皇后问题的全方位解决策略【python 力扣51题】

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…