找回密码
 注册
Simdroid-非首页
查看: 183|回复: 4

[2. C/C++/C#] 请教关于share memory的知识

[复制链接]
发表于 2005-1-25 21:36:01 | 显示全部楼层 |阅读模式 来自 上海普陀区
最近需要用share memory做一个测试,我用一个线程先创建share memory,然后把这个线程杀掉,最后用另一个线程访问它,但是程序却跑不到底,附上程序,请指点:)
我本意想在第一个线程里,给share memory赋上值,想在第二个线程读出来

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

发表于 2005-1-26 22:33:27 | 显示全部楼层 来自 天津

Re:请教关于share memory的知识

Simdroid开发平台
1.线程数据共享用全局变量就可以了,内存映射是为了不同进程之间共享数据使用的。
2.创建内存映射文件的代码段完成创建后已经用CloseHandle(hMapFile);关闭了内存映射文件,也就是创建的内存映射文件此时已经撤销了,所以后面的代码无法再访问这个内存映射文件。

内存映射我只用过一次,我使用的具体情况是:主程序创建一个命名的内存映射文件(不关闭),然后启动子进程,子进程完成一些处理后将处理结果写入该命名的内存映射文件中,子进程结束。最后主程序取出内存映射文件中的数据,关闭内存映射文件。

一点拙见,仅供参考!
 楼主| 发表于 2005-1-27 20:22:30 | 显示全部楼层 来自 上海普陀区

Re:请教关于share memory的知识

谢谢,我也发现了你所说的问题,也许我们可以得出结论,在windows下,share memory只是用来在进程间共享数据,当主线程被kill掉后,子进程无法访问,但linux下的share memory却不同了,它是独立于线程的,即使创建share memory的进程被kill后,其他进程仍然可以通过唯一的ID来访问到它,楼上大侠如果有兴趣,我可以把程序贴上来:)
发表于 2005-1-29 16:23:30 | 显示全部楼层 来自 天津

Re:请教关于share memory的知识

虽然你写的创建内存映射和访问内存映射都是在一个程序里实现的,但是这个程序必须在执行两次的情况下才能完成这个测试,也就是说仍然是进程间共享内存的测试,而不是线程。

我想如果仅仅是关闭了创建内存映射的线程,该内存映射是不会被撤销的。我学艺不精,有个情况我也没有弄清楚,那就是子进程对于父进程的句柄继承。父进程在创建子进程的时候可以指定是否让子进程继承自己的句柄,如果允许继承的话,我想在父进程关闭而子进程没有关闭的情况下父进程创建的内存映射仍然是存在的。

我对linux不甚了解,不过可以贴上来让偶见识见识^_^
 楼主| 发表于 2005-1-30 11:47:18 | 显示全部楼层 来自 上海普陀区

Re:请教关于share memory的知识

你好,代码不小心被删了,我把主要函数及简单步骤献上,请见谅
1. 首先创建一个share memory,并且将当前进程attach,得到进程空间的地址,可以在其中任意赋值,比如字符串等等。用到的函数为shmget(),shmat(),但要深入研究shmget()的参数列表!
2. 重新写一个main(),取得share memory的ID,同样attach,进而取得进程空间的地址,通过这个地址,试着打出刚才赋的值,如果一样,就正确了

如果你试过还有什么问题,我们可以再讨论:-p
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-11-2 01:24 , Processed in 0.037889 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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