在多进程应用程序开发中,C++共享内存是一种高效、快速的进程间通信(IPC)方式。它允许多个进程访问同一块物理内存区域,从而实现数据的高速交换。本教程将从零开始,带你一步步掌握如何在C++中使用共享内存,即使你是编程小白也能轻松上手!

共享内存是操作系统提供的一种机制,允许多个进程将同一段物理内存映射到各自的虚拟地址空间中。这样,一个进程写入的数据,另一个进程可以立即读取,无需通过内核复制数据,因此速度非常快。
在Linux/Unix系统中,通常使用POSIX或System V接口;在Windows中,则使用CreateFileMapping等API。本文以跨平台常用的POSIX共享内存为例进行讲解。
确保你的系统支持POSIX共享内存(大多数现代Linux发行版都支持)。编译时需链接rt库(使用 -lrt 参数)。
首先,我们使用 shm_open() 创建或打开一个共享内存对象,并用 ftruncate() 设置其大小。
#include <sys/mman.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <cstring>#include <iostream>int main() { const char* shm_name = "/my_shared_memory"; const size_t shm_size = 4096; // 4KB // 创建或打开共享内存对象 int fd = shm_open(shm_name, O_CREAT | O_RDWR, 0666); if (fd == -1) { perror("shm_open"); return 1; } // 设置共享内存大小 if (ftruncate(fd, shm_size) == -1) { perror("ftruncate"); return 1; } std::cout << "共享内存对象已创建,名称: " << shm_name << std::endl; return 0;}使用 mmap() 将共享内存映射到当前进程的虚拟地址空间,之后就可以像操作普通指针一样读写共享内存了。
// 接上例void* ptr = mmap(0, shm_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);if (ptr == MAP_FAILED) { perror("mmap"); return 1;}// 写入数据const char* message = "Hello from Process A!";std::strcpy(static_cast<char*>(ptr), message);std::cout << "数据已写入共享内存" << std::endl;另一个程序只需以只读或读写方式打开同一个共享内存对象,并映射即可读取数据。
// 读取端代码int fd = shm_open("/my_shared_memory", O_RDONLY, 0666);if (fd == -1) { perror("shm_open"); return 1;}void* ptr = mmap(0, 4096, PROT_READ, MAP_SHARED, fd, 0);if (ptr == MAP_FAILED) { perror("mmap"); return 1;}std::cout << "从共享内存读取到: " << static_cast<char*>(ptr) << std::endl;使用完毕后,务必解除映射并删除共享内存对象,避免内存泄漏。
// 解除映射munmap(ptr, shm_size);// 关闭文件描述符close(fd);// 删除共享内存对象(通常由最后一个使用者调用)shm_unlink("/my_shared_memory");/my_shm),且不能包含其他斜杠。shm_unlink() 删除对象,否则重启前会一直占用资源。通过本教程,你已经掌握了如何在C++中使用共享内存编程实现高效的C++ IPC。共享内存是高性能多进程应用的核心技术之一,适用于需要频繁交换大量数据的场景,如游戏服务器、实时数据处理系统等。
记住:性能越高,责任越大。务必做好同步和资源管理,才能写出健壮可靠的程序!
本文由主机测评网于2025-12-28发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20251213540.html