为了账号安全,请及时绑定邮箱和手机立即绑定

共享内存的疑惑

标签:
C#

共享内存的疑惑

上一篇文章中”.net remoting和wcf自托管——一个bug引发的警示”,我稍微提了下c++的共享内存,当时我有一个推测,就是在客户端读取共享内存前,谁修改过共享内存。但是我经过了好多次调试,发现只有一次写内存,其它的都是读取内存,这个值是怎么变的呢?目前还不清楚。当共享内存刚刚写完后,立即读出来的值是正确的,等过“一小会”,可能就是多少毫秒吧。再次读取的值就变了。这正是我百思不得其解的地方。

代码是前辈写的,可能擅长c++,继续上一篇的文章,我把c++的代码贴出来:
             

复制代码

        static ShareDataRW()
        {

            Handle = CreateFileMappingA(new IntPtr(-1), IntPtr.Zero, 0x04, 0, 1024, "Local\\NoteFirstShare_Memory");            if (Handle == IntPtr.Zero)                return;
            ShareDataMemoryPoint = MapViewOfFile(Handle, SECTION_ALL_ACCESS, 0, 0, 1024);
            ShareDataType = typeof(ShareData);            if (OfficeAddinServicesPort == 0)
                OfficeAddinServicesPort = 4211;

        }

复制代码

复制代码

       [DllImport("kernel32.dll")]        public static extern IntPtr CreateFileMappingA(
            IntPtr hFile,
            IntPtr lpFileMappingAttributes,            int flProtect,            int dwMaximumSizeHigh,            int dwMaximumSizeLow,            string lpName);

        [DllImport("kernel32.dll")]        public static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject, int dwDesiredAccess, int dwFileOffsetHigh, int dwFileOffsetLow, int dwNumberOfBytesToMap);

复制代码

CreateFileMappingA方法: 为指定文件创建或打开命名或未命名的文件映射对象
MapViewOfFile方法:将一个文件映射对象映射到当前应用程序的地址空间

文件映射这些概念涉及到操作系统里面的东西,不太好理解。这些可以慢慢学习的。 CreateFileMappingA函数的最后一个参数,是共享内存名称,如果我修改了这个参数值后,读写共享内存的数据就一致了。于是我去查这个参数的含义:

如果此参数与现有映射对象的名称匹配,则该函数请求具有flProtect指定的保护的对象的访问权限。

如果此参数为NULL,则创建没有名称的文件映射对象。

如果lpName与现有事件,信号量,互斥锁,等待计时器或作业对象的名称匹配,则该函数将失败,并且GetLastError 函数将返回ERROR_INVALID_HANDLE。这是因为这些对象共享相同的命名空间。

该名称可以具有“全局”或“本地”前缀,以在全局或会话命名空间中显式创建对象。名称的其余部分可以包含除反斜杠字符()之外的任何字符。从会话零以外的会话在全局命名空间中创建文件映射对象需要 SeCreateGlobalPrivilege 特权。有关更多信息,请参阅 内核对象命名空间

通过使用终端服务会话实现快速用户切换。第一个登录用户使用会话0(零),下一个登录用户使用会话1(一),依此类推。内核对象名称必须遵循为终端服务概述的准则,以便应用程序可以支持多个用户。

 

这一段摘自微软官网上面,读的不甚明白。这个参数的值设置应该没什么问题,因为它没有报任何错误,可以正常读写内存。那么问题,究竟出哪呢?

原文出处:https://www.cnblogs.com/wangqiang3311/p/9379014.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消