我打算使用內存映射打開一個文件。CreateFileMapping程序之間的同步?
該文件已被另一個進程以相同的方式打開,即它有自己的內存映射視圖打開並不時編輯該文件。
我希望自己編輯同一文件,並儘可能有效地與其他進程共享訪問權限,而不會由於每個進程的衝突而造成對另一進程的更改。
我可以首先打開的文件直接:
IntPtr f_ptr = CreateFile(
path,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
IntPtr.Zero,
OPEN_ALWAYS,
FILE_FLAG_RANDOM_ACCESS,
IntPtr.Zero);
直接編輯文件的二進制,但是,是無效的,其他進程的內存映射對象是容易過寫我的變化。
如果我打開自己的文件映射和我自己的視圖,如下所示,另一個過程似乎會自動更新,以便不會覆蓋我的編輯。
這裏發生了什麼樣的同步性?
這不是我已經打開了我自己的映射視圖到其他進程的文件映射。我在同一個文件上創建了一個全新的FileMapping。
文件系統或FileMapping系統似乎以某種方式理解這一點。爲什麼?
// file map pointer
IntPtr m_ptr = CreateFileMapping(f_ptr, IntPtr.Zero, PAGE_READWRITE, 0, 0, "MyMapping");
// map view pointer
IntPtr view_ptr = MapViewOfFileEx(m_ptr, FILE_MAP_WRITE, 0, 0, 0, IntPtr.Zero);
// EDIT FILE CONTENTS
FlushViewOfFile(view_ptr, 0);
UnmapViewOfFile(view_ptr);
CloseHandle(m_ptr);
確切的模擬是兩個線程訪問相同的數組。如果他們訪問相同的元素,則需要鎖定。一個有名的互斥體,通常。 – 2010-11-29 18:24:53