C++共享内存怎么用|详细使用教程
答案:C++中通过POSIX共享内存实现高效进程间通信,使用shm_open创建、mmap映射、munmap解除并shm_unlink删除,需配合同步机制避免竞态。
答案:C++中通过POSIX共享内存实现高效进程间通信,使用shm_open创建、mmap映射、munmap解除并shm_unlink删除,需配合同步机制避免竞态。

在C++中使用共享内存,主要是为了实现进程间高效的数据共享。共享内存允许多个进程访问同一块物理内存区域,避免了频繁的数据拷贝,适合对性能要求较高的场景。在Linux系统下,通常使用POSIX共享内存或System V共享内存接口。下面介绍基于POSIX的方式,因为它更现代、易用。
创建和映射共享内存
使用POSIX共享内存需要包含sys/mman.h、fcntl.h和unistd.h等头文件。
步骤如下:
- 使用shm_open()创建或打开一个共享内存对象,返回文件描述符。
- 使用ftruncate()设置共享内存的大小。
- 使用mmap()将共享内存映射到当前进程的地址空间。
示例代码(创建并写入):
#include#include #include #include #include int main() { const char* name = "/my_shared_memory"; const size_t size = 4096;
// 创建共享内存对象 int fd = shm_open(name, O_CREAT | O_RDWR, 0666); if (fd == -1) { perror("shm_open"); return 1; } // 设置大小 if (ftruncate(fd, size) == -1) { perror("ftruncate"); return 1; } // 映射内存 void* ptr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (ptr == MAP_FAILED) { perror("mmap"); return 1; } // 写入数据 const char* msg = "Hello from process!"; std::strcpy((char*)ptr, msg); std::cout << "Data written to shared memory.\n"; // 解除映射 munmap(ptr, size); close(fd); return 0;}
访问已存在的共享内存
另一个进程可以以只读或读写方式打开同一个共享内存对象,进行数据读取或修改。
示例代码(读取数据):
#include#include #include #include int main() { const char* name = "/my_shared_memory"; const size_t size = 4096;
// 打开已存在的共享内存 int fd = shm_open(name, O_RDONLY, 0); if (fd == -1) { perror("shm_open read"); return 1; } // 映射内存 void* ptr = mmap(0, size, PROT_READ, MAP_SHARED, fd, 0); if (ptr == MAP_FAILED) { perror("mmap read"); return 1; } // 读取并输出 std::cout << "Read from shared memory: " << (char*)ptr << "\n"; // 清理 munmap(ptr, size); close(fd); return 0;}
清理共享内存
使用完毕后,应解除映射并删除共享内存对象,防止资源泄漏。
- 调用munmap()解除映射。
- 调用shm_unlink()删除共享内存名称,当所有进程都关闭后,系统会自动释放资源。
清理示例:
// 在写入进程结束前或单独脚本中调用
shm_unlink("/my_shared_memory");
注意:共享内存不提供同步机制,若多个进程同时读写,需配合使用信号量或互斥锁来避免竞态条件。
基本上就这些。只要按步骤创建、映射、读写和清理,就能在C++中顺利使用共享内存。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















