linux下共享内存终于搞定了
在linux下,使用ace中的共享内存,并且共享内存使用map容器来管理数据,那么对于关键字需要特别注意:要能保证key保存在共享去。怎么实现呢? 好办,自己实现copy函数,hash函数和比较函数。 能否给点比较详细的内容?比较感兴趣。问这个问题的人不少。 主要思想:保证key值和value都保存在共享区。
本人使用的是map表在共享区管理数据,当时用的Key是使用const char*. 但是在不同进程中访问共享区内容时会发生段错误,也就是内存访问错误。
仔细研究了源代码,发现key值是直接赋值的。也就是说在进程1中,插入数据,那么他的key值就是在进程1的内存空间内(如果key是局部变量的话,在同一进程访问也会发生段错误),而不是在共享区内。那么在进程2中访问key肯定就出错了。
然后就想,能不能做到key自动copy到共享区去,成为:key:valule;key:value....这种记录方式呢?想到了类(本人很少使用类,因为太熟悉了,把类的汇编后代码都研究透了,感觉特没意思了,回归c的基本方式了---自我感觉良好一次,呵呵),为什么不利用编译器对类这种结构的copy构造函数处理呢?对,利用编译器的对c++类特性的支持,实现了一个adapt(使用模版实现)接口,完成类的copy构造函数,这样在map->bind的时候自然就把数据copy到共享区了。
最后,因为ace仅实现了基本数据类型的hash函数和比对函数。要自己重新实现自己的类的hash函数和对比函数吗?回答是肯定的。但是也不要惊慌,无须全部自己来写。ace已经为我们定义了函数类模版,只要实现我们自己的hash和比对函数类就可以了。
这样,在使用map时,就可以map<自己定义的key类,值类>就可以了。key和value就全部保存在共享内存里面了,不同进程间可以放心的访问使用了。
工作平台:linux 6.23内核
[ 本帖最后由 jonathanliu2004 于 2008-7-7 09:11 编辑 ] 为什么搞得那么复杂,弄得那么玄虚,其实只要重写allocator就可以了,真正难的是如何将对象本身放入共享内存,还不能对对象有太多限制(比如可以有继承、虚函数)。我是想不出来,不过用变通的办法是不是可以,请大家帮忙想想 如果用ace的map,单单重新实现allocator是不可以的。因为ace里面已经有了可以实现共享内存的allocator,何必自己去实现呢?
这里的重点不是allocator,而是如何再共享内存中使用map数据结构。而我给出就是如何再共享内存中使用map来管理数据!
所以楼上的,你理解错我的意思了,呵呵。
[ 本帖最后由 jonathanliu2004 于 2008-7-13 21:18 编辑 ] 我所说的是stl中的allocator,不光map,所有的stl容器都可以通过自定义allocator来实现置入共享内存。这种实现方式比较简单正规,只需提供共享内存分配器,而不要求不同的key和value须定义不同的拷贝函数,所以可以应用在较复杂的数据类型上。
探讨而已,欢迎不同意见。呵呵
页:
[1]