Windows下实现共享内存C++

共享内存

概述

共享内存是指在多处理器的计算机系统中,能够被不同的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);//关闭句柄
  • 1
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在 Windows 平台上使用 C++ 实现共享内存的示例代码: ``` #include <windows.h> #include <iostream> using namespace std; int main() { HANDLE hMapFile; LPCTSTR pBuf; // 创建共享内存 hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4096, TEXT("Local\\MyFileMappingObject")); // 共享内存名字 if (hMapFile == NULL) { cout << "Could not create file mapping object: " << GetLastError() << endl; return 1; } // 在当前进程的虚拟地址空间中映射共享内存 pBuf = (LPTSTR)MapViewOfFile( hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 4096); if (pBuf == NULL) { cout << "Could not map view of file: " << GetLastError() << endl; // 关闭共享内存 CloseHandle(hMapFile); return 1; } // 写入数据到共享内存 CopyMemory((PVOID)pBuf, "Hello Shared Memory!", sizeof("Hello Shared Memory!")); cout << "Data written to shared memory: " << pBuf << endl; // 释放共享内存映射 UnmapViewOfFile(pBuf); // 关闭共享内存 CloseHandle(hMapFile); return 0; } ``` 在上面的代码中,我们使用了 Windows API 中的 `CreateFileMapping()` 和 `MapViewOfFile()` 函数来创建和访问共享内存。我们首先创建了一个共享内存对象,并指定了共享内存的大小和名称。我们然后使用 `MapViewOfFile()` 函数将共享内存映射到当前进程的虚拟地址空间中,从而可以在进程中访问共享内存。最后,我们使用 `CopyMemory()` 函数将数据写入共享内存,并使用 `UnmapViewOfFile()` 函数释放共享内存映射。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值