共享内存
概述
共享内存是指在多处理器的计算机系统中,能够被不同的CPU访问的内存。
应用
共享内存主要应用进程间通信,允许多个进程访问同一块内存。
特点
1、共享内存是进程间通信最快一种的方式。一个进程在共享内存写入了数据,所有使用该共享内存的进程都能获取到这些数据。
2、共享内存的使用应当是互斥的。如进程A写内存的时候,进程B就不应当读内存等。
共享内存相关函数操作原型
1、共享内存的创建函数原型:
HANDLE CreateFileMapping(
HANDLE hFile, //物理文件句柄
LPSECURITY_ATTRIBUTES lpAttributes, //安全设置
DWORD flProtect, //文件数据访问方式
DWORD dwMaximumSizeHigh, //高位文件大小
DWORD dwMaximumSizeLow, //低位文件大小
LPCTSTR lpName //共享内存名称
);
2、共享内存的内存映射函数原型:
LPVOID MapViewOfFile(
HANDLE hFileMappingObject, //已创建共享内存的句柄
DWORD dwDesiredAccess, //文件数据的访问方式
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap); //文件的映射长度
3、打开共享内存的函数原型
HANDLE OpenFileMappingA(
DWORD dwDesiredAccess, //文件数据的访问方式
BOOL bInheritHandle,//函数返回的句柄是否由新句柄继承
LPCTSTR lpName//共享内存名称
);
共享内存原理
共享内存实现原理图:
共享内存的代码实现
程序A
void createSharedMemCpp() {
//创建共享文件句柄
hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE,//物理文件句柄
NULL,
PAGE_READWRITE,//可读可写
0,
BUF_SIZE,
shareZoneName);//共享内存名称
if (hMapFile == NULL) {
cout << "创建共享内存失败!" << endl;
return;
}
//映射缓存区视图,得到共享内存的指针
pBuf = (LPTSTR)MapViewOfFile(hMapFile,//已经创建的文件映射对象的句柄
FILE_MAP_ALL_ACCESS,//可读可写
0,
0,
BUF_SIZE);//映射视图的大小
if (pBuf == NULL) {
cout << "映射缓存区视图失败" << endl;
return;
}
}
程序B
void openSharedMemCpp() {
//打开共享文件句柄
hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,//访问模式,可读可写
0,
shareZoneName);//共享内存名称
if (NULL == hMapFile) {
DWORD err = ::GetLastError();
cout << "打开共享文件失败" << err << endl;
return;
}
//得到共享内存指针
pBuf = (LPTSTR)MapViewOfFile(hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
0);
if (pBuf == NULL) {
cout << "映射共享内存失败" << endl;
return;
}
}
总结
共享内存在程序结束是一定要释放内存空间。
UnmapViewOfFile(pBuf);//解除映射
CloseHandle(hMapFile);//关闭句柄