讲师中心 微信公众号
AI工具推荐 视频效率加速

C++怎么操作共享内存_C++多进程教程【高效】

风芳酱_5982

风芳酱_5982

发布时间:2026-02-22 12:06:39

|

703人浏览过

|

来源于php中文网

原创

现代C++多进程共享内存应优先选POSIX接口(shm_open+mmap),因其路径命名、unlink即时释放、权限模型统一;SysV(shmget+shmat)易因ftok路径错误或IPC_RMDID延迟释放引发问题。

c++怎么操作共享内存_c++多进程教程【高效】

共享内存用 shm_open 还是 shmget?

Linux 下 C++ 多进程共享内存,本质是选 POSIX 还是 SysV 接口。前者用 shm_open + mmap,后者用 shmget + shmat。现代项目优先选 POSIX:路径式命名、支持 unlink 立即释放、与文件系统权限模型一致。

常见错误是混用:比如用 shm_open 创建但误调 shmat,会直接返回 -1 并设 errno = EINVAL。SysV 的 key_t 生成也容易出错——ftok 依赖真实存在的路径,传个不存在的文件名会导致 ftok 返回 -1,后续 shmget 必然失败。

  • shm_open 的 name 参数必须以 / 开头(如 "/my_shm"),不能带额外路径分隔符("/tmp/my_shm" 是非法的)
  • 创建后务必调 ftruncate 设置大小,否则 mmap 会失败并报 errno = ENOMEM
  • SysV 方式下,shmctl(..., IPC_RMID, ...) 只是标记删除,实际内存要等所有进程 detach 后才释放——别以为调了就立刻干净

mmap 映射时 MAP_SHARED 和 MAP_PRIVATE 怎么选?

共享内存必须用 MAP_SHARED。选 MAP_PRIVATE 看似能读写,但修改不会反映到其他进程,相当于每人一份副本——这根本不是共享内存,只是碰巧用了同一段物理内存初始化。

另一个坑是 prot 参数:如果只传 PROT_READ,映射成功,但写入会触发 SIGSEGV;而 PROT_WRITE 单独用也不行,必须和 PROT_READ 按位或(PROT_READ | PROT_WRITE),否则 mmap 直接失败。

立即学习“C++免费学习笔记(深入)”;

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 映射地址建议传 nullptr 让内核选,硬指定地址容易冲突,尤其在 ASLR 开启时
  • 映射长度必须 ≤ ftruncate 设置的大小,超了不会报错,但越界访问行为未定义(大概率段错误)
  • 多个进程映射同一对象,各自 mmap 返回的虚拟地址通常不同,别拿指针值跨进程传递

怎么安全地同步读写?

共享内存本身不提供同步机制。裸用 int flag 做标志位是典型错误——没有内存屏障,编译器和 CPU 都可能重排指令,导致一个进程看到“已就绪”但数据还没写完。

最轻量且可移植的做法是配合 POSIX 命名信号量:sem_open 创建,sem_wait/sem_post 控制临界区。注意信号量名也要以 / 开头(如 "/my_sem"),且需在所有进程间显式关闭(sem_close)和销毁(sem_unlink)。

  • 别用局部 std::atomic 变量放在共享内存里——它依赖平台内存序保证,但跨进程时缓存一致性由硬件和 OS 共同保障,标准库不承诺跨进程原子性
  • 如果必须用自旋锁,得用 __atomic_thread_fence 或 std::atomic_thread_fence 显式加屏障,且初始化要确保所有进程看到一致的初始值
  • 信号量初始化:首次创建者应调 sem_init(仅用于匿名信号量)或用 sem_open 的 O_CREAT 标志;重复打开无需再 init

程序崩溃后共享内存残留怎么办?

POSIX 共享内存对象(/dev/shm/ 下的文件)不会随进程退出自动清理,尤其崩溃时没调 shm_unlink,下次启动就会 shm_open 失败(errno = EEXIST)。

可靠做法是在 shm_open 时加 O_EXCL 标志,如果失败且 errno == EEXIST,先尝试 shm_unlink 再重试。但要注意:shm_unlink 只删名字,内存仍存在直到最后一个 fd 关闭——所以得确保旧进程确实已死,否则新进程可能读到脏数据。

  • 开发期可手动清理:ls /dev/shm 查看,rm /dev/shm/my_shm 删除(需权限)
  • 生产环境建议用带版本号的名称(如 "/my_shm_v2"),避免强制清理影响正在运行的旧实例
  • SysV 方式下残留更隐蔽:ipcs -m 查共享内存段,ipcrm -M <shmid></shmid> 手动删

共享内存的麻烦不在创建,而在生命周期管理——名字冲突、残留对象、同步缺失、映射状态不一致,这些问题往往在压测或异常退出后才暴露。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6879

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3305

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4288

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2925

2025.08.29

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3188

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5149

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3849

2025.12.29

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn