news 2026/3/22 5:16:35

C++共享内存小白入门指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++共享内存小白入门指南

什么是共享内存?

想象一下,你和你的室友共用一个冰箱。你们都可以往里面放东西,也可以从里面拿东西,这就是共享内存的基本概念!在C++中,共享内存是一种让不同进程(可以理解为不同的程序)能够访问同一块内存区域的技术。

为什么要使用共享内存?

  1. 高效通信:进程间通信最快的方式之一
  2. 数据共享:多个程序可以访问相同数据
  3. 减少复制:不需要在不同进程间复制大量数据

基础知识准备

在深入之前,你需要知道:

  • 进程:正在运行的程序实例
  • 内存:程序存储数据的地方
  • 系统调用:操作系统提供的功能接口

共享内存使用步骤(Linux/Unix系统)

第一步:创建共享内存

#include<sys/ipc.h>#include<sys/shm.h>#include<iostream>intmain(){// 生成一个唯一的keykey_t key=ftok("shmfile",65);// 创建共享内存段,1024字节大小// IPC_CREAT表示创建,0666是权限(可读可写)intshmid=shmget(key,1024,IPC_CREAT|0666);if(shmid<0){std::cerr<<"创建共享内存失败"<<std::endl;return1;}std::cout<<"共享内存创建成功,ID: "<<shmid<<std::endl;return0;}

第二步:附加到共享内存

#include<sys/ipc.h>#include<sys/shm.h>#include<iostream>#include<cstring>intmain(){key_t key=ftok("shmfile",65);intshmid=shmget(key,1024,0666);// 附加到共享内存char*shared_memory=(char*)shmat(shmid,nullptr,0);if(shared_memory==(char*)-1){std::cerr<<"附加到共享内存失败"<<std::endl;return1;}// 写入数据到共享内存std::strcpy(shared_memory,"你好,共享内存!");std::cout<<"数据已写入共享内存"<<std::endl;// 分离共享内存(但不删除)shmdt(shared_memory);return0;}

第三步:读取共享内存数据

#include<sys/ipc.h>#include<sys/shm.h>#include<iostream>intmain(){key_t key=ftok("shmfile",65);intshmid=shmget(key,1024,0666);// 附加到共享内存char*shared_memory=(char*)shmat(shmid,nullptr,0);std::cout<<"从共享内存读取: "<<shared_memory<<std::endl;// 分离共享内存shmdt(shared_memory);return0;}

第四步:删除共享内存

#include<sys/ipc.h>#include<sys/shm.h>#include<iostream>intmain(){key_t key=ftok("shmfile",65);intshmid=shmget(key,1024,0666);// 删除共享内存段shmctl(shmid,IPC_RMID,nullptr);std::cout<<"共享内存已删除"<<std::endl;return0;}

完整示例:进程间通信

写入进程(writer.cpp)

#include<sys/ipc.h>#include<sys/shm.h>#include<iostream>#include<cstring>#include<unistd.h>intmain(){// 生成keykey_t key=ftok("shmfile",65);// 创建共享内存(1KB大小)intshmid=shmget(key,1024,IPC_CREAT|0666);// 附加到共享内存char*str=(char*)shmat(shmid,nullptr,0);std::cout<<"写入进程启动,等待输入..."<<std::endl;// 连续写入数据for(inti=1;i<=5;i++){sprintf(str,"消息 %d",i);std::cout<<"写入: "<<str<<std::endl;sleep(2);// 等待2秒}// 写入结束标志strcpy(str,"结束");// 分离共享内存shmdt(str);return0;}

读取进程(reader.cpp)

#include<sys/ipc.h>#include<sys/shm.h>#include<iostream>#include<cstring>#include<unistd.h>intmain(){// 生成相同的keykey_t key=ftok("shmfile",65);// 获取共享内存intshmid=shmget(key,1024,0666);// 附加到共享内存char*str=(char*)shmat(shmid,nullptr,0);std::cout<<"读取进程启动,等待数据..."<<std::endl;// 持续读取数据while(true){std::cout<<"读取: "<<str<<std::endl;// 检查是否收到结束标志if(strcmp(str,"结束")==0){break;}sleep(1);// 每秒检查一次}// 分离共享内存shmdt(str);// 删除共享内存段shmctl(shmid,IPC_RMID,nullptr);std::cout<<"共享内存已清理"<<std::endl;return0;}

编译和运行

# 编译写入进程g++ writer.cpp -o writer# 编译读取进程g++ reader.cpp -o reader# 打开两个终端,先运行写入进程./writer# 在另一个终端运行读取进程./reader

Windows下的共享内存(简单示例)

#include<windows.h>#include<iostream>#include<string>intmain(){// 创建共享内存HANDLE hMapFile=CreateFileMapping(INVALID_HANDLE_VALUE,// 使用系统页面文件nullptr,// 默认安全属性PAGE_READWRITE,// 可读可写0,// 高位文件大小256,// 低位文件大小(256字节)L"MySharedMemory");// 共享内存名称// 映射到进程地址空间char*pBuf=(char*)MapViewOfFile(hMapFile,// 共享内存句柄FILE_MAP_ALL_ACCESS,// 可读可写访问0,0,256);// 使用共享内存strcpy(pBuf,"Windows共享内存示例");std::cout<<"写入: "<<pBuf<<std::endl;// 清理UnmapViewOfFile(pBuf);CloseHandle(hMapFile);return0;}

注意事项和最佳实践

  1. 同步问题:多个进程同时访问时需要同步机制(如信号量)
  2. 内存泄漏:确保正确释放共享内存
  3. 安全性:共享内存对所有有权限的进程可见
  4. 大小限制:系统对共享内存大小有限制

常见问题解答

Q: 共享内存和普通内存有什么区别?
A: 共享内存可以被多个进程访问,普通内存只能被创建它的进程访问。

Q: 进程退出后共享内存还在吗?
A: 除非显式删除,否则共享内存会一直存在。

Q: 如何防止数据冲突?
A: 使用同步机制,如互斥锁、信号量等。

Q: 共享内存大小有限制吗?
A: 有,取决于系统配置,通常可以通过系统命令查看和调整。

学习建议

  1. 从简单的示例开始,先理解基本概念
  2. 实践编写两个进程通信的程序
  3. 学习同步机制,处理并发访问
  4. 查阅系统文档,了解具体限制和特性

记住,共享内存是强大的工具,但需要谨慎使用。确保你理解了同步和清理的重要性,避免内存泄漏和数据损坏。祝你学习顺利!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/15 20:40:41

2026年备战浙大全日制 iMBA 复试必须要抓住的三大关键机会!

随着12月20日全国MBA联考初试结束&#xff0c;多数考生第一时间都完成了自己的初试估分工作。具体多少分数可以进入复试&#xff1f;杭州达立易考教育认为&#xff1a;如果初试分数估在150 分上下&#xff0c;就可提前启动浙大全日制 iMBA 项目的复试备考&#xff0c;因为从这两…

作者头像 李华
网站建设 2026/3/15 20:40:42

比亚迪参观研学归来!这趟有点小值哦[特殊字符]

去到比亚迪总部&#xff0c;我总算明白它为啥能硬刚特斯拉&#x1f680; 这趟标杆研学直接给我打通任督二脉&#xff01;走进比亚迪深圳总部展厅直接被震住 那面专利墙一眼望不到头&#x1f4dc; 刀片电池针刺实验现场看的0爆燃&#xff01; CTB技术把空间利用率拉满&#xff0…

作者头像 李华
网站建设 2026/3/21 23:49:46

内网渗透靶场实操命令速查表

本速查表基于之前的 VulhubMetasploitable 2 靶场实操清单&#xff0c;涵盖从外网突破到持久化的全流程命令&#xff0c;可直接复制执行。环境说明&#xff1a;攻击机 Kali&#xff08;192.168.56.101&#xff09;、跳板机 Metasploitable 2&#xff08;192.168.56.102&#xf…

作者头像 李华
网站建设 2026/3/15 16:33:36

从零开始做一个最简单的CNN实例

一、CNN基本概念 站内已经有详细的教程 【深度学习】一文搞懂卷积神经网络&#xff08;CNN&#xff09;的原理&#xff08;超详细&#xff09;_卷积神经网络原理-CSDN博客、 二、完成一个简单实例需要掌握什么 1.张量基本操作 我们将张量基本操作分为 4 个层次 &#xff0…

作者头像 李华