2017-11-13 19 views
0

Windows 환경에서 C/C++에서 프로세스 간 통신을 시도하고 있습니다.프로세스 간 뮤텍스 읽기/쓰기 잠금

공유 메모리 페이지 파일을 만들 때 두 개의 프로세스가 해당 파일의 핸들을 가져옵니다. 그것은 다음과 같습니다 :

Process1 : 공유 메모리 영역을 초기화하십시오. Process2가 그것을 채울 때까지 기다리십시오.

프로세스 2 : 공유 메모리 영역을 처리하십시오. 그것에 물건을 넣어.

나는 process1에도 명명 된 뮤텍스를 만들고 있습니다. 이제 process1은 뮤텍스를 생성 한 직후에 뮤텍스의 소유권을 획득합니다 (WaitSingleObject 사용). 분명히 메모리 영역에는 아무것도 없으므로 뮤텍스를 릴리스해야합니다. 이제 뮤텍스를 다시 얻으 려하지 않고 메모리가 가득 찰 때까지 기다려야합니다.

나는 조건 변수를 생각하고 있었다. Process2는 메모리 영역을 채우면 조건 변수에 신호를 보내고 process1은 즉시 정보를 얻습니다.

그러나 조건 변수에 대한 MS 설명서에 따라 named이 아니기 때문에 초기화에서 명확한 프로세스간에 공유되지 않습니다.

또한 공유 메모리 영역은 주어진 순간에 하나의 요소를 보유 할 수 있습니다. 즉, process2는 프로세스 1이 정보를 추출하지 않는 한 그것을 채우고 다시 채울 수 없습니다.

주어진 설명에서 조건 변수가이 목적 (또는 모니터)에 가장 적합하다는 것은 분명합니다. 이것 주위에 방법이 있습니까?

+0

세마포어 ......... 두 개의 semas, A, B, 0으로 초기화. P1은 A. 대기 상태로 P2가 버퍼를 채 웁니다. P2는 A 신호를 보내고 B에서 대기합니다. P1은 버퍼 데이터를 처리 한 다음 B 신호를 보내고 A는 다시 대기합니다. –

+0

@MartinJames 나는 그것들을 사용하고 싶었지만 조건 변수처럼 작동하지 않는다. 뮤텍스는 기본적으로 카운트가 1로 설정된 세마포어입니다. 소유권을 기다리지 않고 신호를 기다려야합니다. 세마포어를 사용하면 뮤텍스를 사용하는 것처럼 소유권을 얻게됩니다. 다른 사람이 나를 알릴 때까지 소유권을 원하지 않습니다. – Everyone

+0

'뮤텍스는 본질적으로 카운트가 1로 설정된 세마포어입니다. –

답변

0

뮤텍스 (대부분의 동기화 프리미티브)는 동일한 프로세스 내에서 다른 스레드에 의해 사용되는 프로세스 별 개체입니다. 프로세스 간에는 공유 할 수 없습니다 (최소한 Unix에서는).

서로 다른 프로세스간에 사물을 동기화하려면 통신에 일부 IPC 메커니즘을 사용해야합니다.

+1

아주 사실. Windows API에는 프로세스 전체에서 공유 할 수있는 named-mutex가 있습니다. 내 질문에, 그것은 기존의 메커니즘을 사용하지 IPC를 구현하려고 분명합니다. – Everyone

+0

"당신은 mutex 개체를 사용하여 여러 스레드 또는 프로세스에 의해 동시 액세스로부터 공유 리소스를 보호 할 수 있습니다."... 출처 https://msdn.microsoft.com/en-us/library/windows/desktop/ms686927(v=vs.85).aspx – Everyone

+0

@ 모두 괜찮아, 내 대답이 너무 조금 보인다. 유닉스 중심 - 나는하지 않는다. Windows 많이. 죄송합니다. –

0

것은 내가 전에이 이벤트를 사용했다. 2 개의 자동 재설정 이벤트를 사용하십시오. 1 데이터 준비 이벤트와 하나의 버퍼 준비 이벤트가 있습니다. Writer는 버퍼 준비를 기다리고 데이터를 쓰고 데이터 준비 이벤트를 설정합니다. 리더는 데이터 준비 이벤트를 대기하고 메모리를 읽고 버퍼 준비 이벤트를 설정합니다. 제대로 완료되면 뮤텍스가 필요하지 않습니다.

+0

'불쌍한 남자의 세마포어':) –