使用内存映射文件可实现C++跨平台共享内存,Windows通过CreateFileMapping和MapViewOfFile,POSIX系统用shm_open与mmap,配合条件编译封装统一接口。示例代码展示创建、映射及访问共享内存区域,支持多进程数据共享。需注意名称唯一性、资源清理与同步机制。推荐使用Boost.Interprocess库简化开发,其提供跨平台抽象并集成同步原语,提升稳定性和开发效率。

在C++中实现跨平台的共享内存区域,关键在于使用可移植的API。由于不同操作系统对共享内存的支持方式不同(如Windows用映射文件,Linux/Unix用POSIX或System V),直接调用系统API会导致代码不可移植。推荐使用封装良好的跨平台机制,比如基于文件映射的内存映射方式,并借助条件编译或抽象接口统一操作。
使用内存映射文件(Memory-Mapped Files)
内存映射是实现跨平台共享内存最常用的方法。它将一个文件或共享对象映射到多个进程的地址空间,实现数据共享。
原理: 创建一个命名的共享内存区域(通常通过一个临时文件或操作系统支持的匿名共享对象),然后多个进程映射同一块区域进行读写。
Windows 和 POSIX 的兼容实现示例:
立即学习“C++免费学习笔记(深入)”;
#include #include #ifdef _WIN32 #include #else #include #include #include #include #include #endifclass SharedMemory {public: SharedMemory(const std::string& name, size_t size) : m_name(name), m_size(size), m_handle(nullptr), m_ptr(nullptr) { open(); } ~SharedMemory() { close(); } void* data() const { return m_ptr; } bool is_valid() const { return m_ptr != nullptr; }private: void open() {#ifdef _WIN32 // Windows: 使用 CreateFileMapping 和 MapViewOfFile HANDLE hMapFile = CreateFileMappingA( INVALID_HANDLE_VALUE, // 使用分页文件,而非磁盘文件 nullptr, PAGE_READWRITE, 0, static_cast(m_size), m_name.c_str() ); if (hMapFile == nullptr) return; m_handle = hMapFile; m_ptr = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, m_size);#else // POSIX: 使用 shm_open + mmap int fd = shm_open(m_name.c_str(), O_CREAT | O_RDWR, 0666); if (fd == -1) return; // 设置共享内存大小 if (ftruncate(fd, m_size) == -1) { close(fd); return; } void* ptr = mmap(nullptr, m_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (ptr == MAP_FAILED) { close(fd); return; } m_handle = reinterpret_cast(static_cast(fd)); m_ptr = ptr;#endif } void close() { if (m_ptr) {#ifdef _WIN32 UnmapViewOfFile(m_ptr); CloseHandle(static_cast(m_handle));#else munmap(m_ptr, m_size); int fd = static_cast(reinterpret_cast(m_handle)); close(fd); shm_unlink(m_name.c_str()); // 可选:删除共享内存对象#endif m_ptr = nullptr; m_handle = nullptr; } }private: std::string m_name; size_t m_size; void* m_handle; void* m_ptr;};
使用示例
两个进程可以使用相同的名称访问同一块共享内存。
int main() { SharedMemory shm("my_shared_memory", 4096); if (!shm.is_valid()) { // 处理错误 return 1; } // 写入数据 char* data = static_cast(shm.data()); std::strcpy(data, "Hello from process!"); // 其他进程可读取该数据 return 0;}
注意事项与建议
共享内存不提供同步机制,需配合互斥锁(如命名信号量或mutex)防止竞态条件。命名冲突:确保共享内存名称在系统范围内唯一,建议加前缀或UUID。资源清理:进程异常退出可能导致共享内存残留,应确保调用shm_unlink或关闭句柄。权限设置:POSIX共享内存注意shm_open的mode参数,避免权限不足。性能:内存映射适合大块数据共享,小数据可考虑管道或消息队列。
更高级选择:Boost.Interprocess
若项目允许使用第三方库,Boost.Interprocess 提供了完整的跨平台共享内存封装,极大简化开发。
示例:
“`cpp#include #include
using namespace boost::interprocess;
shared_memory_object shm(create_only, “my_shm”, read_write);shm.truncate(1024);mapped_region region(shm, read_write);std::strcpy(static_cast(region.get_address()), “Hi”);
Boost方案自动处理平台差异,支持同步原语,是生产环境推荐做法。
基本上就这些。手动实现可用内存映射,追求稳定和效率建议上Boost。
以上就是c++++怎么创建一个跨平台的共享内存区域_C++中跨进程共享内存的实现方式的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1482835.html
微信扫一扫
支付宝扫一扫