공유 메모리 영역을 사용하여 데이터를 두 번째 프로세스로 가져옵니다.프로세스 간 (un) 동기화 된 다중 스레드 액세스로 CreateFileMapping 및 MapViewOfFile?
첫 번째 프로세스는 CreateFileMapping
(INVALID_HANDLE_VALUE, ..., PAGE_READWRITE, ...)
과 MapViewOfFile
(... FILE_MAP_WRITE)
을 사용합니다.
제 2 공정은 OpenFileMapping
(FILE_MAP_WRITE, ...)
및 MapViewOfFile
(... FILE_MAP_WRITE)
을 이용한다.
docs 상태 :들은 지정된 시간에 동일한 데이터를 포함하는 경우, 파일 매핑 오브젝트의
다중 뷰 간섭이다. 파일보기가 동일한 파일에 의해 백업 된 모든 파일 매핑 개체 에서 파생 된 경우에 발생합니다. (...)
중요한 예외 중 하나는 동일한 파일로 백업 된 개체를 매핑 한 파일에서 파생 된 파일보기가 특정 시간에 일치하거나 동일하다는 것입니다. 프로세스 내에서 뷰에 대한 일관성이 보장되고 다른 프로세스에서 매핑 된 뷰에 대해서는 이 보장됩니다.
예외는 원격 파일과 관련이 있습니다. (...)
저는 (페이징 파일에 의해 뒷받침되는) 공유 메모리를 사용하고 있기 때문에 프로세스 간의 메모리가 일관성있는 다른 프로세스를 볼 때 약간의 동기화가 필요하다고 가정했을 것입니다. 썼습니다. 그러나 어떤 동기화가 정확히 필요한지는 확실하지 않습니다.
내가 (간체) 한 현재의 패턴은 다음과 같이이다 :
Process1 | Process2
... | ...
/* write to shared mem, */ | ::WaitForSingleObject(hDataReady); // real code has error handling
/* then: */
::SetEvent(hDataReady); | /* read from shared mem after wait returns */
... | ...
도 공유 메모리의 경우,이 충분히 동기화인가?
일반적으로 두 프로세스간에 어떤 동기화가 필요합니까?
하나의 단일 프로세스 내에서 SetEvent
에 대한 호출은 확실하게 full memory barrier을 구성하지만 확실히 프로세스간에 공유 메모리가 있는지 여부는 확실하지 않습니다.
파일 매핑은 2 개의 프로세스에서 볼 수있는 메모리 영역을 가져옵니다. x86/x64에서 실행 중이므로 윈도우에 있고, CPU에 총 저장 메모리 주문이 있기 때문에 여기에 표시 한 내용이 정상적으로 처리되어야합니다. – camelccc
공개 된 질문이 * 많이 있습니다. 여기에 오는 도움이 당신에게 적합하지 않다면이 사이트를 사용하는 데별로 중요하지 않습니다. –
@HansPassant : "개방형"이란 말은 내 질문에 답을 표시해야한다고 생각한다는 것을 의미합니까? –