私はメモリマッピングを使用してファイルを開く予定です。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);
正確なアナログは、同じ配列にアクセスする2つのスレッドです。同じ要素にアクセスするには、ロックが必要です。名前付きのmutexです。 –