共享内存内指针使用问题,求关注!!!谢谢~~

lxj7224323 2013-03-17 12:05:29
各位同学,请教个问题:
我现在预想实现一个有动态增加机制的共享内存,一来可以应予系统吞吐量(量大的时候增加记录节点,量小的时候释放记录节点),二者则可以合理控制内存的使用上限。
预计的实现流程是:
1、创建共享内存,定义节点结构,结构如下:
struct namedShareM {
sem_t mutex, nempty, nstored;//多进程同步访问信号量
struct stringNode * headNode;//头结点
struct stringNode * currNode;//当前处理节点
};
//节点结构
struct stringNode {
char charStr[ 100 ];
struct stringNode * next;
};
2、初始化共享内存,封装put方法,负责将值放入共享内存,此方法由A进程调用,方法中会malloc一块节点,用初始化好的共享内存两个指示指针指向这块空间。
3、封装get方法,负责从共享内存中取A进程放入的值,此方法由B进程调用,方法中会用共享内存头结点指针取得处理节点,问题就出现在这里,下面上截图:
A进程put地址:
(gdb) print reqSharePtr->headNode
$1 = (stringNode *) 0x6050d0
(gdb) print &reqSharePtr->headNode->charStr[0]
$3 = 0x6050d0 "hello"
(gdb) x/16xw 0x6050d0
0x6050d0: 0x6c6c6568 0x0000006f
但是B进程的地址空间:
(gdb) print reqSharePtr->headNode
$1 = (stringNode *) 0x6050d0
(gdb) print &reqSharePtr->headNode->charStr[0]
$2 = 0x6050d0 "@!u\367\377\177"
(gdb) x/16xw 0x6050d0
0x6050d0 <_GLOBAL_OFFSET_TABLE_+232>: 0xf7752140 0x00007fff
从运行的结果可以看出
1、共享内存确实保存了malloc后的地址值;
2、是否可以证明B进程的地址空间不同于A进程的地址空间,因为同一个地址值确实不一样的数据?
那该怎样实现动态共享内存呢?
谢谢大家的帮忙,感激!!!
...全文
222 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxj7224323 2013-03-17
  • 打赏
  • 举报
回复
7楼的同学,我只是想知道能不能实现动态机制的共享内存?谢谢~
qq120848369 2013-03-17
  • 打赏
  • 举报
回复
讨论个毛, 读一下UNP就懂了, 用共享内存才能共享, 就这个道理.
lxj7224323 2013-03-17
  • 打赏
  • 举报
回复
再次感谢mujiok2003同学的回复帮助,我大概浏览了一下你提供的辅助材料,你的意思是指boost lib里面实现了共享内存的管理库吗?请问可否方便给个联系邮箱或者QQ,一些问题希望可以讨论~
lxj7224323 2013-03-17
  • 打赏
  • 举报
回复
谢谢楼上同学的答复,我觉得在这个问题的处理上应该是属于内存空间管理和进程地址空间的问题,想先知道自己实现方法欠缺考虑的地方,再者就是听听这个问题的一些解决办法,谢谢~
mujiok2003 2013-03-17
  • 打赏
  • 举报
回复
好好研究这个吧: http://www.boost.org/doc/libs/1_53_0/doc/html/interprocess.html
mujiok2003 2013-03-17
  • 打赏
  • 举报
回复
不要自己实现,用操作系统的API或者第三方的lib。
lxj7224323 2013-03-17
  • 打赏
  • 举报
回复
谢谢楼上同学的回复,楼上的同学正解,对于这点我不是很清楚,只是小试了一下,呵呵果断不行~~ 那需要实现动态机制的共享内存是否有什么办法呢?谢谢
qq120848369 2013-03-17
  • 打赏
  • 举报
回复
此方法由A进程调用,方法中会malloc一块节点,用初始化好的共享内存两个指示指针指向这块空间。 用了malloc还能叫共享?
lxj7224323 2013-03-17
  • 打赏
  • 举报
回复
感谢9楼同学的热心回答,通过查找你提供给的资料,这个问题有了个比较好的解决办法,从这个问题中也体现出一些知识盲点,比如 placement new 的使用,谢谢给予帮助的同学!!
qq120848369 2013-03-17
  • 打赏
  • 举报
回复
引用 8 楼 lxj7224323 的回复:
7楼的同学,我只是想知道能不能实现动态机制的共享内存?谢谢~
百度:共享内存环形队列 注意: 1, 定长元素: 队尾与队头留1格以区分队列空与队列满. 2, 不定长元素: 队尾与队头留一段字节以区分队列空与队列满.

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧