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

在C++中实现跨平台的共享内存区域,关键在于使用可移植的API。由于不同操作系统对共享内存的支持方式不同(如Windows用映射文件,Linux/Unix用POSIX或System V),直接调用系统API会导致代码不可移植。推荐使用封装良好的跨平台机制,比如基于文件映射的内存映射方式,并借助条件编译或抽象接口统一操作。
内存映射是实现跨平台共享内存最常用的方法。它将一个文件或共享对象映射到多个进程的地址空间,实现数据共享。
原理: 创建一个命名的共享内存区域(通常通过一个临时文件或操作系统支持的匿名共享对象),然后多个进程映射同一块区域进行读写。
Windows 和 POSIX 的兼容实现示例:
立即学习“C++免费学习笔记(深入)”;
#include <string>
#include <cstdint>
#ifdef _WIN32
#include <windows.h>
#else
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#endif
class 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<DWORD>(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<void*>(static_cast<intptr_t>(fd));
m_ptr = ptr;
#endif
}
void close() {
if (m_ptr) {
#ifdef _WIN32
UnmapViewOfFile(m_ptr);
CloseHandle(static_cast<HANDLE>(m_handle));
#else
munmap(m_ptr, m_size);
int fd = static_cast<int>(reinterpret_cast<intptr_t>(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<char*>(shm.data());
std::strcpy(data, "Hello from process!");
// 其他进程可读取该数据
return 0;
}shm_unlink或关闭句柄。shm_open的mode参数,避免权限不足。若项目允许使用第三方库,Boost.Interprocess 提供了完整的跨平台共享内存封装,极大简化开发。
示例:
```cpp #includeusing 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<char*>(region.get_address()), "Hi");
<p>Boost方案自动处理平台差异,支持同步原语,是生产环境推荐做法。</p> 基本上就这些。手动实现可用内存映射,追求稳定和效率建议上Boost。
以上就是c++++怎么创建一个跨平台的共享内存区域_C++中跨进程共享内存的实现方式的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号