在文档
![](/icons/53361smhl.gif)
ACE Programmer's Guide, The: Practical Design Patterns for Network and
![](/icons/53361System.gif)
s Programming
![](/icons/53361smhr.gif)
中介绍了
![](/icons/53361yi.gif)
种和位置无关
![](/icons/53361de.gif)
共享内存分配
![](/icons/53361dou.gif)
但是实际上这种方式并不是太理想
![](/icons/53361dou2.gif)
按照文章中
![](/icons/53361de.gif)
介绍
![](/icons/53361de.gif)
方式
![](/icons/53361dou.gif)
其实主要是采用ALWAYS_FIXED参数
![](/icons/53361dou.gif)
使用制定
![](/icons/53361de.gif)
基地址作为共享内存
![](/icons/53361de.gif)
地址
![](/icons/53361dou2.gif)
同时使用辅助类保证2个进程使用相对地址使用共享内存
ACE_MMAP_Memory_Pool_Options options
(ACE_DEFAULT_BASE_ADDR,
ACE_MMAP_Memory_Pool_Options::ALWAYS_FIXED);
ACE_NEW_RETURN (g_allocator,
ALLOCATOR (BACKING_STORE,
BACKING_STORE,
&options),
-1);
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("Mapped to base address %@\n"),
g_allocator->base_addr
![](/icons/53361kh.gif)
));
showRecords
![](/icons/53361kh.gif)
;
但是
![](/icons/53361dou.gif)
首先要求大家能使用相同
![](/icons/53361de.gif)
基地址
![](/icons/53361dou.gif)
按照ACE给出
![](/icons/53361de.gif)
例子
![](/icons/53361dou2.gif)
其给出默认基地址
![](/icons/53361yi.gif)
个宏ACE_DEFAULT_BASE_ADDR(在Linux下是0x80000000)
![](/icons/53361dou2.gif)
![](/icons/53361yinwei.gif)
地址空间管理都是操作系统
![](/icons/53361de.gif)
负责
![](/icons/53361de.gif)
事情
![](/icons/53361dou.gif)
所以要求使用同
![](/icons/53361yi.gif)
块共享内存
![](/icons/53361de.gif)
2个进程分配
![](/icons/53361de.gif)
基地址是
![](/icons/53361yi.gif)
样
![](/icons/53361de.gif)
是很不靠谱
![](/icons/53361de.gif)
事情
![](/icons/53361dou2.gif)
采用这种方式可能有2个后果
![](/icons/53361dou.gif)
第
![](/icons/53361yi.gif)
如果你要使用多个共享内存
![](/icons/53361dou.gif)
你要自己计算管理进程空间
![](/icons/53361dou.gif)
第 2你
![](/icons/53361chengxu.gif)
可移植性很低
![](/icons/53361dou.gif)
甚至会出现在
![](/icons/53361yi.gif)
台机器上可以运行
![](/icons/53361dou.gif)
在另外1台机器无法运行
![](/icons/53361dou2.gif)
所以大家慎用这个特性比较好
![](/icons/53361dou2.gif)
把
![](/icons/53361chengxu.gif)
![](/icons/53361de.gif)
可靠运行寄托于运气好
![](/icons/53361dou.gif)
这不应该是
![](/icons/53361yi.gif)
个
![](/icons/53361chengxu.gif)
员
![](/icons/53361de.gif)
作风
所以对于共享内存
![](/icons/53361dou.gif)
如果希望实现和位置无关
![](/icons/53361de.gif)
分配
![](/icons/53361dou.gif)
我个人
![](/icons/53361de.gif)
忠告如下:
l
![](/icons/53361yi.gif)
开始分配足够
![](/icons/53361de.gif)
空间
![](/icons/53361dou.gif)
不要再进行扩展【注】
![](/icons/53361dou2.gif)
![](/icons/53361yinwei.gif)
扩展共享内存可能意味着原来所有
![](/icons/53361de.gif)
共享内存相关指针会失效
l 各自进程管理自己
![](/icons/53361de.gif)
地址空间
![](/icons/53361dou.gif)
共享内存内部不要保存任何指针(特别不要在共享内存内保存指针)
![](/icons/53361dou.gif)
所有
![](/icons/53361de.gif)
地址都使用相对值
![](/icons/53361dou2.gif)
这样才能保证重入
![](/icons/53361dou.gif)
和基础地址变化下不出现问题
![](/icons/53361smhl.gif)
ACE Programmer's Guide, The: Practical Design Patterns for Network and
![](/icons/53361System.gif)
s Programming
![](/icons/53361smhr.gif)
中间还提出过处理共享内存池封装
![](/icons/53361dou.gif)
但考虑到涉及所有
![](/icons/53361de.gif)
共享内存地址
![](/icons/53361de.gif)
都要调整
![](/icons/53361dou2.gif)
不是太认可这种方式
另外由于ACE
![](/icons/53361de.gif)
容器都使用了指针
![](/icons/53361dou.gif)
不建议在共享内存中使用ACE
![](/icons/53361de.gif)
容器
延伸阅读
最新评论