C++共享内存模板
2012-12-14 16:30
260 查看
这是我写的一个能够使用共享内存的模板,匆忙书写,如有疏漏,望请改进,但要记得回复我改进的方法哦,谢谢!
-----------------------------------头文件---------------------------------------------
/***********************************************************************
* 共享内存类
* version:1.0
* 文件名:ShearMem.h
* 作者:常亮
* 时间:2011年3月28日3:36:59
* 功能:TShareMem模板可以共享内存中的保存传入的类,而且已做读写同步设置
* 大家可以随便使用,如有改进请发布新版本哦
************************************************************************/
#pragma once
#include <windows.h>
#define SHAREMEM_REQUESTREAD 0x01 // 请求读内存
#define SHAREMEM_READING 0x02 // 正在读内存
#define SHAREMEM_REQUESWRITE 0x04 // 请求写内存
#define SHAREMEM_WRITEING 0x08 // 正在写内存
#define OUTTIME 100 // 超时时间
#define READMEM_ONLYONE // 是否只有一个线程读
template <class T> // 不要用指针
class TShareMem
{
public:
TShareMem(TCHAR* pName)
{
m_hMapping = CreateFileMapping( //创建一个有名的共享内存
(HANDLE)0xFFFFFFFF, //0xFFFFFFFF表示创建一个进程间共享的对象
NULL,
PAGE_READWRITE, //读写共享
0, // 共享区间高32位大小
sizeof(SHORT)+sizeof(T), //共享区间低32位大小
pName);
m_pMutex = (SHORT*)MapViewOfFile( //映射到本进程的地址空间
m_hMapping,
FILE_MAP_READ|FILE_MAP_WRITE,
0,
0,
0);
m_pData = (T*)(m_pMutex+sizeof(SHORT));
}
~TShareMem()
{
if (m_hMapping != NULL)
{
CloseHandle(m_hMapping);
return;
}
}
private:
HANDLE m_hMapping;
SHORT* m_pMutex; // 共享内存的权限控制标志位指针
T* m_pData; // 共享内存中的指针
public:
BOOL UpdateMem(T data)
{
DWORD starttime = GetTickCount();
DWORD endtime = starttime;
while (TRUE)
{
// 状态:写入数据
if (((*m_pMutex)&SHAREMEM_REQUESWRITE) // 请求写
&& !((*m_pMutex)&SHAREMEM_WRITEING) // 不在写
&& !((*m_pMutex)&SHAREMEM_REQUESTREAD) // 不请求读
&& !((*m_pMutex)&SHAREMEM_READING)) // 不在读
{
(*m_pMutex) |= SHAREMEM_WRITEING;
(*m_pMutex) &= ~SHAREMEM_REQUESWRITE;
(*m_pData) = data;
(*m_pMutex) &= ~SHAREMEM_WRITEING;
return TRUE;
}
// 状态:请求写的状态
if (!((*m_pMutex)&SHAREMEM_REQUESWRITE) // 不在读
&& !((*m_pMutex)&SHAREMEM_REQUESWRITE) // 不在请求写
&& !((*m_pMutex)&SHAREMEM_WRITEING)) // 不在写
{
(*m_pMutex) |= SHAREMEM_REQUESWRITE;
(*m_pMutex) &= ~SHAREMEM_REQUESTREAD;
}
// 超时
endtime = GetTickCount();
if ((endtime-starttime) > OUTTIME)
{
if ((*m_pMutex)&SHAREMEM_REQUESWRITE)
{
(*m_pMutex) &= ~SHAREMEM_REQUESWRITE;
}
return FALSE;
}
}
return FALSE;
};
BOOL ReadMem(T& data)
{
DWORD starttime = GetTickCount();
DWORD endtime = starttime;
while (TRUE)
{
// 状态:读入数据
if (((*m_pMutex)&SHAREMEM_REQUESTREAD) // 准备读
&& !((*m_pMutex)&SHAREMEM_WRITEING) // 不在写
&& !((*m_pMutex)&SHAREMEM_READING)
&& !((*m_pMutex)&SHAREMEM_REQUESWRITE)) // 不请求写
{
(*m_pMutex) &= !SHAREMEM_REQUESTREAD;
(*m_pMutex) |= SHAREMEM_READING;
data = (*m_pData);
(*m_pMutex) &= ~SHAREMEM_READING;
return TRUE;
}
// 状态:请求写的状态
if (!((*m_pMutex)&SHAREMEM_REQUESTREAD) // 不是请求读
&& !((*m_pMutex)&SHAREMEM_READING)
&& !((*m_pMutex)&SHAREMEM_REQUESWRITE)
&& !((*m_pMutex)&SHAREMEM_WRITEING)) // 不在写
{
(*m_pMutex) |= SHAREMEM_REQUESTREAD;
}
// 超时
endtime = GetTickCount();
if ((endtime-starttime) > OUTTIME)
{
if ((*m_pMutex)&SHAREMEM_REQUESTREAD)
{
(*m_pMutex) &= ~SHAREMEM_REQUESTREAD;
}
return FALSE;
}
}
return FALSE;
};
};
// 测试类
// 用于测试上面的模板
class CShearMem
{
public:
CShearMem();
TCHAR m_str[100];
~CShearMem(void);
};
---------------------------------------源文件-----------------------------
#include "StdAfx.h"
#include "ShearMem.h"
CShearMem::CShearMem()
{
}
CShearMem::~CShearMem(void)
{
}
------------------------------------main头文件--内有使用方法--------------------
// ShareMemary.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
#include "ShearMem.h"
#include <string>
int _tmain(int argc, _TCHAR* argv[])
{
TShareMem<CShearMem> m_it(__T("kek"));
CShearMem f;
wcscpy(f.m_str, __T("ddddddddddd"));
m_it.UpdateMem(f);
CShearMem i;
m_it.ReadMem(i);
wprintf(i.m_str);
system("pause");
return 0;
}
--------------------------------------------------------------
-----------------------------------头文件---------------------------------------------
/***********************************************************************
* 共享内存类
* version:1.0
* 文件名:ShearMem.h
* 作者:常亮
* 时间:2011年3月28日3:36:59
* 功能:TShareMem模板可以共享内存中的保存传入的类,而且已做读写同步设置
* 大家可以随便使用,如有改进请发布新版本哦
************************************************************************/
#pragma once
#include <windows.h>
#define SHAREMEM_REQUESTREAD 0x01 // 请求读内存
#define SHAREMEM_READING 0x02 // 正在读内存
#define SHAREMEM_REQUESWRITE 0x04 // 请求写内存
#define SHAREMEM_WRITEING 0x08 // 正在写内存
#define OUTTIME 100 // 超时时间
#define READMEM_ONLYONE // 是否只有一个线程读
template <class T> // 不要用指针
class TShareMem
{
public:
TShareMem(TCHAR* pName)
{
m_hMapping = CreateFileMapping( //创建一个有名的共享内存
(HANDLE)0xFFFFFFFF, //0xFFFFFFFF表示创建一个进程间共享的对象
NULL,
PAGE_READWRITE, //读写共享
0, // 共享区间高32位大小
sizeof(SHORT)+sizeof(T), //共享区间低32位大小
pName);
m_pMutex = (SHORT*)MapViewOfFile( //映射到本进程的地址空间
m_hMapping,
FILE_MAP_READ|FILE_MAP_WRITE,
0,
0,
0);
m_pData = (T*)(m_pMutex+sizeof(SHORT));
}
~TShareMem()
{
if (m_hMapping != NULL)
{
CloseHandle(m_hMapping);
return;
}
}
private:
HANDLE m_hMapping;
SHORT* m_pMutex; // 共享内存的权限控制标志位指针
T* m_pData; // 共享内存中的指针
public:
BOOL UpdateMem(T data)
{
DWORD starttime = GetTickCount();
DWORD endtime = starttime;
while (TRUE)
{
// 状态:写入数据
if (((*m_pMutex)&SHAREMEM_REQUESWRITE) // 请求写
&& !((*m_pMutex)&SHAREMEM_WRITEING) // 不在写
&& !((*m_pMutex)&SHAREMEM_REQUESTREAD) // 不请求读
&& !((*m_pMutex)&SHAREMEM_READING)) // 不在读
{
(*m_pMutex) |= SHAREMEM_WRITEING;
(*m_pMutex) &= ~SHAREMEM_REQUESWRITE;
(*m_pData) = data;
(*m_pMutex) &= ~SHAREMEM_WRITEING;
return TRUE;
}
// 状态:请求写的状态
if (!((*m_pMutex)&SHAREMEM_REQUESWRITE) // 不在读
&& !((*m_pMutex)&SHAREMEM_REQUESWRITE) // 不在请求写
&& !((*m_pMutex)&SHAREMEM_WRITEING)) // 不在写
{
(*m_pMutex) |= SHAREMEM_REQUESWRITE;
(*m_pMutex) &= ~SHAREMEM_REQUESTREAD;
}
// 超时
endtime = GetTickCount();
if ((endtime-starttime) > OUTTIME)
{
if ((*m_pMutex)&SHAREMEM_REQUESWRITE)
{
(*m_pMutex) &= ~SHAREMEM_REQUESWRITE;
}
return FALSE;
}
}
return FALSE;
};
BOOL ReadMem(T& data)
{
DWORD starttime = GetTickCount();
DWORD endtime = starttime;
while (TRUE)
{
// 状态:读入数据
if (((*m_pMutex)&SHAREMEM_REQUESTREAD) // 准备读
&& !((*m_pMutex)&SHAREMEM_WRITEING) // 不在写
&& !((*m_pMutex)&SHAREMEM_READING)
&& !((*m_pMutex)&SHAREMEM_REQUESWRITE)) // 不请求写
{
(*m_pMutex) &= !SHAREMEM_REQUESTREAD;
(*m_pMutex) |= SHAREMEM_READING;
data = (*m_pData);
(*m_pMutex) &= ~SHAREMEM_READING;
return TRUE;
}
// 状态:请求写的状态
if (!((*m_pMutex)&SHAREMEM_REQUESTREAD) // 不是请求读
&& !((*m_pMutex)&SHAREMEM_READING)
&& !((*m_pMutex)&SHAREMEM_REQUESWRITE)
&& !((*m_pMutex)&SHAREMEM_WRITEING)) // 不在写
{
(*m_pMutex) |= SHAREMEM_REQUESTREAD;
}
// 超时
endtime = GetTickCount();
if ((endtime-starttime) > OUTTIME)
{
if ((*m_pMutex)&SHAREMEM_REQUESTREAD)
{
(*m_pMutex) &= ~SHAREMEM_REQUESTREAD;
}
return FALSE;
}
}
return FALSE;
};
};
// 测试类
// 用于测试上面的模板
class CShearMem
{
public:
CShearMem();
TCHAR m_str[100];
~CShearMem(void);
};
---------------------------------------源文件-----------------------------
#include "StdAfx.h"
#include "ShearMem.h"
CShearMem::CShearMem()
{
}
CShearMem::~CShearMem(void)
{
}
------------------------------------main头文件--内有使用方法--------------------
// ShareMemary.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
#include "ShearMem.h"
#include <string>
int _tmain(int argc, _TCHAR* argv[])
{
TShareMem<CShearMem> m_it(__T("kek"));
CShearMem f;
wcscpy(f.m_str, __T("ddddddddddd"));
m_it.UpdateMem(f);
CShearMem i;
m_it.ReadMem(i);
wprintf(i.m_str);
system("pause");
return 0;
}
--------------------------------------------------------------
相关文章推荐
- C++文本查询程序 定义类管理数据 用引用共享数据 不用智能指针 C++Primer练习12.27
- C++访问一个带密码的共享文件夹的方法
- C/C++多文件共享全局变量时,使用extern的规范
- 资源共享--C++和C
- Android NDK编译C/C++为so共享对象
- C/C++ 日常学习总结(第二十二篇)共享内存实现C++
- 小白学c++之多线程共享资源
- Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(5)
- c++实现读写共享锁
- C++多线程学习---线程间的共享数据
- c++实现读写共享锁
- C++容器模板在共享内存中的使用
- C++进程间通信之共享内存
- C++ 友元(共享数据)
- C++文本查询程序 定义类管理数据 用引用共享数据 不用智能指针 C++Primer练习12.27
- matlab mex中C++内存全局共享和持久化
- C++文本查询程序 定义类管理数据 用引用共享数据 不用智能指针 C++Primer练习12.27
- C++ [ 共享数据保护 ]
- c++中共享内存操作函数解析(三)
- asp.net,java,jsp,安卓Android,php,vb.net,c#/c++免费毕业课程设计源码共享下载