0

공유 메모리 영역을 사용하여 데이터를 두 번째 프로세스로 가져옵니다.프로세스 간 (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을 구성하지만 확실히 프로세스간에 공유 메모리가 있는지 여부는 확실하지 않습니다.

+0

파일 매핑은 2 개의 프로세스에서 볼 수있는 메모리 영역을 가져옵니다. x86/x64에서 실행 중이므로 윈도우에 있고, CPU에 총 저장 메모리 주문이 있기 때문에 여기에 표시 한 내용이 정상적으로 처리되어야합니다. – camelccc

+0

공개 된 질문이 * 많이 있습니다. 여기에 오는 도움이 당신에게 적합하지 않다면이 사이트를 사용하는 데별로 중요하지 않습니다. –

+0

@HansPassant : "개방형"이란 말은 내 질문에 답을 표시해야한다고 생각한다는 것을 의미합니까? –

답변

0

나는 이후 동시에 액세스 메모리는 프로세스하거나 스레드 사이에 하나 개의 프로세스 withing에 공유하는 경우에는 메모리 액세스 동기화 목적으로, 정말 하지 문제를한다는 것을 믿을 에왔다.

Windows에서 공유 메모리 (프로세스간에 공유되는 공유 메모리)의 경우 프로세스의 스레드간에 공유되는 프로세스 내에서 "일반"메모리와 동일한 제한 사항과 지침이 적용됩니다.

내가 생각하는 이유는 프로세스와 스레드가 Windows에서 다소 직각이라는 것입니다. 프로세스는 스레드를위한 "컨테이너"이며, 프로세스가 아무 것도 할 수 있으려면 적어도 하나의 스레드가 필요합니다. 따라서 여러 프로세스의 주소 공간에 매핑되는 메모리의 경우 이러한 여러 프로세스 내에서 실행되는 스레드의 동기화 요구 사항은 실제로 동일한 프로세스 내에서 실행되는 스레드의 경우와 동일해야합니다.

그럼 내 질문에 대한 답변 공유 메모리에 대해서도 충분한 동기화입니까?은 공유 메모리가 "정상적인"메모리와 동일한 동기화를 필요로한다는 것입니다. 물론 모든 동기화 기술이 프로세스 경계에서 작동하는 것은 아니므로 사용할 수있는 분야가 제한적입니다. (예 : exampled에 대한 중요 섹션은 프로세스에서 사용할 수 없습니다.)

0

사용 세마포는 이벤트보다 우수해야합니다.

+0

그 대답은 설명 할 수 있습니다. –

0

두 코드 조각 모두 루프에 있으면 이벤트와 함께 뮤텍스가 필요하므로 Process1이 Process2가 계속 읽는 동안 다시 쓰기를 시작하지 않아야합니다. 보다 구체적으로 뮤텍스는 읽기 또는 쓰기 전에 획득해야하며 읽기 또는 쓰기 후에 릴리스되어야합니다. Process2에서 WFSO를 호출하기 전에 뮤텍스가 해제되었는지 확인하십시오.