메모리 매핑을 사용하여 파일을 열려고합니다.프로그램간에 동기식 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);
정확한 아날로그는 동일한 배열에 액세스하는 두 개의 스레드입니다. 동일한 요소에 액세스하는 경우 잠금이 필요합니다. 전형적으로 명명 된 뮤텍스. –