找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 6342|回复: 5

linux下共享内存终于搞定了

[复制链接]
发表于 2008-7-5 23:17:02 | 显示全部楼层 |阅读模式
在linux下,使用ace中的共享内存,并且共享内存使用map容器来管理数据,那么对于关键字需要特别注意:要能保证key保存在共享去。怎么实现呢? 好办,自己实现copy函数,hash函数和比较函数。
发表于 2008-7-5 23:55:05 | 显示全部楼层
能否给点比较详细的内容?
比较感兴趣。问这个问题的人不少。
 楼主| 发表于 2008-7-7 09:07:19 | 显示全部楼层
主要思想:保证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 编辑 ]
发表于 2008-7-12 00:10:56 | 显示全部楼层
为什么搞得那么复杂,弄得那么玄虚,其实只要重写allocator就可以了,真正难的是如何将对象本身放入共享内存,还不能对对象有太多限制(比如可以有继承、虚函数)。我是想不出来,不过用变通的办法是不是可以,请大家帮忙想想
 楼主| 发表于 2008-7-13 21:15:33 | 显示全部楼层
如果用ace的map,单单重新实现allocator是不可以的。因为ace里面已经有了可以实现共享内存的allocator,何必自己去实现呢?

这里的重点不是allocator,而是如何再共享内存中使用map数据结构。而我给出就是如何再共享内存中使用map来管理数据!

所以楼上的,你理解错我的意思了,呵呵。

[ 本帖最后由 jonathanliu2004 于 2008-7-13 21:18 编辑 ]
发表于 2008-7-16 02:22:51 | 显示全部楼层
我所说的是stl中的allocator,不光map,所有的stl容器都可以通过自定义allocator来实现置入共享内存。这种实现方式比较简单正规,只需提供共享内存分配器,而不要求不同的key和value须定义不同的拷贝函数,所以可以应用在较复杂的数据类型上。

探讨而已,欢迎不同意见。呵呵
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 19:52 , Processed in 0.137628 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表