读书人

关于共享内存互斥的有关问题请高手来

发布时间: 2012-06-15 19:37:05 作者: rapoo

关于共享内存互斥的问题,请高手来指教一下
我自己写了一个类,就是创建一个共享内存,然后实现进程之间共享数据,比如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,不同的程序调用的时候,数据的内存地址也是不同的。

同样了,不同进程本身也是一样。
同一个类只代表生成的代码是一样的,而没有其他更多的含义。
[解决办法]
探讨

TO: unituniverse2

C/C++ code

m_lpFileMapBuffer = MapViewOfFile(m_hFileMap, dwAccess, 0, 0, dwSize);


这个函数的功能到底是传递的指针值还是内容呢?我理解的是传递的指针值,不知道这样理解合适么

[解决办法]
用内存映射文件啊,
何必搞这么复杂?
[解决办法]
探讨

哦,行,那我出现的这个问题你觉得最可能是哪里的问题呢?

[解决办法]
探讨

用内存映射文件啊,
何必搞这么复杂?

[解决办法]
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
[解决办法]
探讨

这只是我简单写的一个例子,写入的进程依次从A写到Z,那我读出也该是这样,但是还是会出现一大堆重复的数据,如:AAABBBBCCCCCDDDD这样, 谢谢

[解决办法]
1。你要在锁区间内部做完所有不能同时操作的事情后,才能离开锁区间。
2。指针不能在进程间传递。不然的话在一个进程得到的指针指向一片内容,传到另一个进程中会指向不知道什么地方去了。


3。MapViewOfFile返回的指针,虽然指向的内容是一样的,但每个进程调用他得到的指针只能该进程自己用。如果有两个进程得到的指针值一样,那也只是巧合(概率还比较大...)。指针是不会共享的
[解决办法]
汗...
你的WriteData目前看来没问题
有问题的是ReadData...

[解决办法]
lock函数就实现错了
[解决办法]
方便的话提供一个你简化过的测试代码
[解决办法]
微软msdn 的 内存映射文件的IPC示范 代码,多么简洁实用

何必搞得那么多包装来包装去没多大意义的类...

赵老湿:能用C语言写xx行的代码,千万不要用c++改写
[解决办法]

while(InterlockedCompareExchange(&lock,1,0)!=0)Sleep(0);
[解决办法]

探讨
不同进程的内存空间完全独立。指针只能在本进程内使用,跨进程将无效。

所以内存共享一定要是共享具体的内容(指针指向的内容),而不能是指针本身,因为到了另一个进程中,指针就失效了。

另外,由于内存空间是完全独立的,所以共享时也只能拷贝内存数据,让该数据在2个进程中都有一个拷贝。而不是说,共享内存就是直接用这个进程读取另一个进程的数据。

注意一下就是了。

读书人网 >C++

热点推荐