共享內存的疑惑

共享內存的疑惑html

上一篇文章中」 .net remoting和wcf自託管——一個bug引起的警示」,我稍微提了下c++的共享內存,當時我有一個推測,就是在客戶端讀取共享內存前,誰修改過共享內存。可是我通過了好屢次調試,發現只有一次寫內存,其它的都是讀取內存,這個值是怎麼變的呢?目前還不清楚。當共享內存剛剛寫完後,當即讀出來的值是正確的,等過「一小會」,可能就是多少毫秒吧。再次讀取的值就變了。這正是我百思不得其解的地方。

代碼是前輩寫的,可能擅長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函數的最後一個參數,是共享內存名稱,若是我修改了這個參數值後,讀寫共享內存的數據就一致了。因而我去查這個參數的含義:


lpName

若是此參數與現有映射對象的名稱匹配,則該函數請求具備flProtect指定的保護的對象的訪問權限。app

若是此參數爲NULL,則建立沒有名稱的文件映射對象。函數

若是lpName與現有事件,信號量,互斥鎖,等待計時器或做業對象的名稱匹配,則該函數將失敗,而且GetLastError 函數將返回ERROR_INVALID_HANDLE。這是由於這些對象共享相同的命名空間。post

該名稱能夠具備「全局」或「本地」前綴,以在全局或會話命名空間中顯式建立對象。名稱的其他部分能夠包含除反斜槓字符()以外的任何字符。從會話零之外的會話在全局命名空間中建立文件映射對象須要 SeCreateGlobalPrivilege 特權。有關更多信息,請參閱 內核對象命名空間學習

經過使用終端服務會話實現快速用戶切換。第一個登陸用戶使用會話0(零),下一個登陸用戶使用會話1(一),依此類推。內核對象名稱必須遵循爲終端服務概述的準則,以便應用程序能夠支持多個用戶。spa

 

這一段摘自微軟官網上面,讀的不甚明白。這個參數的值設置應該沒什麼問題,由於它沒有報任何錯誤,能夠正常讀寫內存。那麼問題,究竟出哪呢?操作系統

相關文章
相關標籤/搜索