公司的游戏客户端和VFS(虚拟文件系统)两进程是通过共享内存来进行通信的,这里学习一下共享内存。

百度百科共享内存特点:所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。其他进程能把同一段共享内存段“连接到”他们自己的地址空间里去。所有进程都能访问共享内存中的地址。如果一个进程向这段共享内存写了数据,所做的改动会即时被有访问同一段共享内存的其他进程看到。共享内存的使用大大降低了在大规模数据处理过程中内存的消耗,但是共享内存的使用中有很多的陷阱,一不注意就很容易导致程序崩溃。

百度百科共享内存注意事项:共享内存相比其他几种方式有着更方便的数据控制能力,数据在读写过程中会更透明。当成功导入一块共享内存后,它只是相当于一个字符串指针来指向一块内存,在当前进程下用户可以随意的访问。缺点是,数据写入进程或数据读出进程中,需要附加的数据结构控制。

代码样例:

创建共享内存:

#include <windows.h>
#include <iostream>
#include <string>
#include <cstring>

using namespace std;

int main()
{
	string strMapName("ShareMemory");                // 内存映射对象名称
	string strComData("This is common data!");        // 共享内存中的数据
	LPVOID pBuffer;                                    // 共享内存指针


	HANDLE hMap = ::CreateFileMapping(INVALID_HANDLE_VALUE,
		NULL,
		PAGE_READWRITE,
		0,
		strComData.length() + 1,
		strMapName.c_str());

	// 映射对象的一个视图,得到指向共享内存的指针,设置里面的数据
	pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
	strcpy((char*)pBuffer, strComData.c_str());
	cout << "写入共享内存数据:" << (char *)pBuffer << endl;

	getchar();            // 注意,进程关闭后,所有句柄自动关闭,所以要在这里暂停

	// 解除文件映射,关闭内存映射文件对象句柄
	::UnmapViewOfFile(pBuffer);
	::CloseHandle(hMap);
	system("pause");
	return 0;
}

读取已创建的共享内存:

#include <windows.h>
#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
using namespace std;

int main()
{
	string strMapName("ShareMemory");                // 内存映射对象名称
	string strComData("This is common data!");        // 共享内存中的数据
	LPVOID pBuffer;                                    // 共享内存指针

	// 首先试图打开一个命名的内存映射文件对象  
	HANDLE hMap = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, strMapName.c_str());
	if (NULL == hMap)
	{
		cout << "打开共享句柄失败" << endl;
	}
	else
	{    
		// 打开成功,映射对象的一个视图,得到指向共享内存的指针,显示出里面的数据
		pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
		cout << "读取共享内存数据:" << (char *)pBuffer << endl;

		// 解除文件映射,关闭内存映射文件对象句柄
		::UnmapViewOfFile(pBuffer);
		::CloseHandle(hMap);
	}

	
	return 0;
}

运行结果:

managed_windows_shared_memory共享数据 windows共享内存原理_共享内存