关于共享内存互斥的问题,请高手来指教一下
我自己写了一个类,就是创建一个共享内存,然后实现进程之间共享数据,比如A进程就是往内存里写入数据,B进程就是从内存里读取数据,当然这是需要加锁互斥的,我自己也写了一个锁,但是锁偶尔会出问题:
例如:A进程依次往内存里写入ABCDEFG,正常情况B读出也是ABCDEFG, 但是却会出现ABCCEFG这样的情况,请各位大侠指教一下
上代码
- C/C++ code
m_lpFileMapBuffer = MapViewOfFile(m_hFileMap, dwAccess, 0, 0, dwSize);LPVOID ShareMemory::GetBuffer(){ return (m_lpFileMapBuffer)?(m_lpFileMapBuffer):(NULL);}void ShareMemory::Lock(){ while ( InterlockedExchange(&m_lock, RESOURCE_IN_USE) == RESOURCE_IN_USE ) Sleep(1);}void ShareMemory::Unlock(){ InterlockedExchange(&m_lock, RESOURCE_IN_FREE);}BOOL ShareMemory::WriteData(char *pData, DWORD dwSize){ Lock(); BOOL ret = FALSE; char *p = (char *)GetBuffer(); if (p) { memcpy(p, (char*)&pData, dwSize); ret = TRUE; } Unlock(); return ret;}BOOL ShareMemory::ReadData(char* &pData, DWORD dwSize){ Lock(); BOOL ret = FALSE; char *p = (char *)GetBuffer(); if (p) { p = pData; ret = TRUE; } Unlock(); return ret;}
[解决办法]
[解决办法]
[解决办法]
大哥,什么叫做“完全独立”呢?
这与是否是一个类没有任何关系。
这么说吧,你知道我们的程序最终其实都是调用系统的api函数的,那么这些函数其实都是在系统自带的dll里面的。
那么,为什么那么多的程序调用同一个dll,居然不会有数据冲突呢?
就是因为所有的程序的内存空间都是完全独立的。即使是同一个dll,不同的程序调用的时候,数据的内存地址也是不同的。
同样了,不同进程本身也是一样。
同一个类只代表生成的代码是一样的,而没有其他更多的含义。
[解决办法]
[解决办法]
用内存映射文件啊,
何必搞这么复杂?
[解决办法]
[解决办法]
[解决办法]
m_lock是啥
[解决办法]
m_lock也应该搞成在进程间共享。不然形同虚设了...
[解决办法]
#pragma data_seg("Shared")
volatile LONG m_lock = RESOURCE_IN_FREE;
#pragma data_seg()
#pragma comment(linker, "/Section:Shared,rws")
[解决办法]
m_lock也要通过filemap共享
看这个 blog.csdn.net/lactoferrin/article/details/7316067
[解决办法]
[解决办法]
1。你要在锁区间内部做完所有不能同时操作的事情后,才能离开锁区间。
2。指针不能在进程间传递。不然的话在一个进程得到的指针指向一片内容,传到另一个进程中会指向不知道什么地方去了。
3。MapViewOfFile返回的指针,虽然指向的内容是一样的,但每个进程调用他得到的指针只能该进程自己用。如果有两个进程得到的指针值一样,那也只是巧合(概率还比较大...)。指针是不会共享的
[解决办法]
汗...
你的WriteData目前看来没问题
有问题的是ReadData...
[解决办法]
lock函数就实现错了
[解决办法]
方便的话提供一个你简化过的测试代码
[解决办法]
微软msdn 的 内存映射文件的IPC示范 代码,多么简洁实用
何必搞得那么多包装来包装去没多大意义的类...
赵老湿:能用C语言写xx行的代码,千万不要用c++改写
[解决办法]
while(InterlockedCompareExchange(&lock,1,0)!=0)Sleep(0);
[解决办法]