读写的时候怎样锁定?
--------------------------------------------------------------- 在16位Windows中,有好几种方法可以共享数据。可能最普通的方法是使用属于另一个进程的窗口来调用SendMessage或者PostMessage。在16位Windows中,这样只能传递一个16位值和一个32位值,。也可以使用GMEM_SHARE标志来分配一块全局内存,再调用SendMessage或者PostMessage来传送(作为参数wParam或lParam)。消息的接收者再调用GlobalLock来得到内存块的地址,然后可以读写数据。
在Win32中,每个进程有自己的地址空间,一个进程不能轻易地访问另一个进程地址空间中的数据,所以不能像16位Windows那样做。Win32系统允许多个进程(运行在同一计算机上)使用内存映射文件来共享数据。实际上,其他共享和传送数据的技术,诸如使用SendMessage或者PostMessage,都在内部使用了内存映射文件。
这种数据共享是让两个或多个进程映射同一文件映射对象的视图,即它们在共享同一物理存储页。这样,当一个进程向内存映射文件的一个视图写入数据时,其他的进程立即在自己的视图中看到变化。但要注意,对文件映射对象要使用同一名字。
以下是一种解决方法的代码:
创建:
HANDLE s_hFileMap = CreateFileMapping((HANDLE)0XFFFFFFFF,NULL,PAGE_READWRITE, 0, 4*1024,_TEXT("MyCustShareData"));
(此函数寻找一个名字为"MyCustShareData"的内存映射文件,不存在则创建,存在则返回已有的句柄,所以当返回值不为空的话,还须检查GetLastError,如果得到ERROR_ALREADY_EXISTS,则表明该名字的内存映射文件已经存在,并未创建成功)
读写:
HANDLE hFile = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, _TEXT("MyCustShareData"));//最后一个参数为名字,必须与创建的相同
if(hFile != NULL)
{
LPVOID lpView = MapViewOfFile(hFile, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);//将内存映射文件的一个视图映射到当前的地址空间
if ((int *)lpView != NULL)
{
int sheardata = (int*)lpview; //读
(int *)lpview = 88; //写
}
UpmapViewOfFile((LPVOID) lpview);
}
CloseHandle(hFile);