用記憶體對映檔案實現多個程式間互斥執行!

2021-05-22 12:15:00 字數 1160 閱讀 4520

if(hmap==null)

else if(getlasterror() == error_already_exists)

else

當程式執行結束了,要記住呼叫closehandle(hmap)關閉這個物件控制代碼,可以在initinstance函式最後return false之前呼叫。

如果要考慮的更周到,使用 同樣可以在程序間共享的 多執行緒同步物件類,如cmutex類物件,來控制對這個記憶體對映檔案物件的讀寫訪問。

與虛擬記憶體類似,保護方式可以是page_readonly或是page_readwrite。如果多程序都對同一 共享記憶體 進行寫訪問,則必須保持相互間同步。對映檔案 還可以指定page_writecopy標誌,可以保證其原始資料不會遭到破壞,同時允許其他程序在必要時自由的運算元據的拷貝。

在建立對映檔案物件後可以呼叫mapviewoffile函式對映到本程序 的 位址空間 內。下面說明建立乙個名為mysharedmem的長度為4096位元組的有名對映檔案:

lpstr pszmysharedmapview=(lpstr)mapviewoffile(hmysharedmapfile,file_map_read|file_map_write,0,0,0);

一旦其他程序獲得對映物件的控制代碼,可以象建立程序那樣呼叫mapviewoffile函式來對映物件檢視。使用者可以使用該物件檢視來進行資料讀寫操作,以達到資料通訊的目的。

當使用者程序結束使用 共享記憶體 後,呼叫unmapviewoffile函式以取消其位址空間內的 檢視:

if (!unmapviewoffile(pszmysharedmapview))

這是題外話了,記憶體對映檔案的主要目的是在頻繁交換資料時減少io操作,你這樣建了又放,而且不斷反覆,io讀寫不但沒少反而可能會增多,因為每次建放對映將是對整個檔案長度的一次io讀寫,比直接在磁碟上區域性讀寫資料量還大。若非要這樣做,你不如,不要對映,直接用磁碟檔案算了。

可能ms也是沒想到會出現這種用法,所以沒考慮快取會影響實時更新,或乾脆就沒打算支援這種用法。

map與unmap在timer中執行。這樣可保證只建乙個對映檔案,我想改動起來,不會難吧?

不斷create並close,對記憶體對映檔案可能不適用,若用原來的方案,實在想不出解決辦法。因為其用法本身可能就不對!

記憶體對映檔案實現共享記憶體

記憶體對映檔案程序間共享記憶體 記憶體對映檔案的另乙個功能是在程序間共享資料,它提供了不同程序共享記憶體的乙個有效 且簡單的方法。後面的許多例子都要用到共享記憶體。共享記憶體主要是通過對映機制實現的。windows 下程序的位址空間在邏輯上是相互隔離的,但在物理上卻是重疊的。所謂的重 對映檔案物件時...

記憶體檔案對映 程序間通訊

記憶體對映檔案可以分為兩種 一種是普通的檔案,它需要乙個普通的檔案控制代碼,用於快速的讀寫檔案,這種檔案的資料在程序退出後會儲存在硬碟上,所以程序在下次執行時可以得到之前的資料 另一種是頁檔案,當建立記憶體對映檔案的時候傳入無效的控制代碼,這時會把頁檔案當作臨時的共享儲存空間,當程序退出後這些資料是...

使用記憶體檔案對映實現共享記憶體

不使用ipc中的共享記憶體 shm 使用記憶體檔案對映的方式來實現共享記憶體 共享記憶體寫入者 使用檔案記憶體對映進行記憶體共享 include include include include include include include include include include using...