共享内存bug

问题描述:

共享内存类

class SharedMemoryWithLock

{

private:

HANDLE hMapFile; // 共享内存文件映射句柄

void* pBuffer; // 共享内存指针

HANDLE hMutex; // 互斥锁句柄

std::wstring name; // 共享内存和互斥锁的名称

// 禁止拷贝和赋值

SharedMemoryWithLock(const SharedMemoryWithLock&) = delete;

SharedMemoryWithLock& operator=(const SharedMemoryWithLock&) = delete;

public:

SharedMemoryWithLock(const std::wstring& name, size_t sizeInBytes)

: name(name), hMapFile(nullptr), pBuffer(nullptr), hMutex(nullptr)

{

// 尝试打开已存在的共享内存

hMapFile = OpenFileMappingW(FILE_MAP_ALL_ACCESS, FALSE, name.c_str());

if (hMapFile == NULL) {

// 如果打开失败(即共享内存不存在),则创建它

hMapFile = CreateFileMappingW(

INVALID_HANDLE_VALUE, // 使用分页文件

NULL, // 默认安全

PAGE_READWRITE, // 保护模式

0, // 高32位文件大小

static_cast<DWORD>(sizeInBytes), // 低32位文件大小

name.c_str()); // 共享内存名称

if (hMapFile == NULL) {

throw std::runtime_error("CreateFileMapping failed");

}

}

// 映射到进程地址空间

pBuffer = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);

if (pBuffer == NULL) {

throw std::runtime_error("MapViewOfFile failed");

}

// 创建互斥锁(始终创建,因为可能多个进程需要同步)

std::wstring mutexName = name + L"_Mutex";

hMutex = CreateMutexW(NULL, FALSE, mutexName.c_str());

if (hMutex == NULL) {

throw std::runtime_error("CreateMutex failed");

}

}

~SharedMemoryWithLock()

{

// 取消映射共享内存视图

if (pBuffer != nullptr) {

UnmapViewOfFile(pBuffer);

pBuffer = nullptr;

}

// 释放互斥锁句柄

if (hMutex != nullptr) {

CloseHandle(hMutex);

hMutex = nullptr;

}

// 注意:我们没有关闭hMapFile,所以共享内存对象仍然存在

// 如果需要关闭共享内存对象,请在这里添加 CloseHandle(hMapFile);

}

// 锁定共享内存

void Lock() {

WaitForSingleObject(hMutex, INFINITE);

}

// 解锁共享内存

void Unlock() {

ReleaseMutex(hMutex);

}

// 获取共享内存指针

void* GetBuffer() {

return pBuffer;

}

// 其他你可能需要的方法...

};

//自定义结构体类

struct Person

{

char name[200];

int age;

double weight;

}

struct Persons

{

int num;

Person all[12345678];

}

int main()

{

std::queue<Persons >* data_Persons _s =

new std::queue<Persons >();

// 创建一个sizeof(data_share_memory_group)字节的共享内存

SharedMemoryWithLock shm(L"MySharedMemory", sizeof(data_share_memory_group));

while (true)

{

//将共享内存数据复制出来开始

try

{

//锁定要共享内存 和 复制共享内存的空间

std::unique_lock<std::mutex> lock(mtx_get_Share_mem);

// 锁定共享内存

shm.Lock();

// 解锁共享内存

shm.Unlock();

}

catch (const std::exception& e) {

std::cerr << "Error: " << e.what() << std::endl;

}

}

//在使用std::queue<Persons > 时,当struct Persons 中Person all[12345678];过大时,执行 shm.Lock()和shm.Unlock();会报错,将Persons中Person[1000],数组改成1000则不报错

相关推荐
坚果派·白晓明4 小时前
【鸿蒙PC三方库移植适配框架解读系列】第八篇:扩展lycium框架使其满足rust三方库适配
c语言·开发语言·华为·rust·harmonyos·鸿蒙
花间相见4 小时前
【PaddleOCR教程01】PP-OCRv5 全面指南:从模型架构到实战部署
开发语言·r语言
小短腿的代码世界4 小时前
Qt 股票订单撮合引擎:高频交易系统的核心心脏
开发语言·数据库·qt·系统架构·交互
REDcker4 小时前
C++变量存储与ELF段布局详解 从const全局到rodata与nm_readelf验证实践
java·c++·面试
谙弆悕博士6 小时前
快速学C语言——第16章:预处理
c语言·开发语言·chrome·笔记·创业创新·预处理·业界资讯
yuan199976 小时前
基于 C# 实现的 Omron HostLink (FINS) 协议 PLC 通讯
开发语言·c#
王老师青少年编程7 小时前
csp信奥赛C++高频考点专项训练之字符串 --【字符串排序】:合并序列
c++·字符串·csp·高频考点·信奥赛·字符串排序·合并序列
qq_422828627 小时前
android图形学之SurfaceControl和Surface的关系 五
android·开发语言·python
handler017 小时前
UDP协议与网络通信知识点
c语言·网络·c++·笔记·网络协议·udp
如竟没有火炬7 小时前
用队列实现栈
开发语言·数据结构·python·算法·leetcode·深度优先