2017-01-25 2 views
0

2 개의 프로세스 동기화에 문제가 있습니다. 3 개의 X 프로세스와 5 개의 Y 프로세스가 있습니다. 또한 나는 2 개의 자원 - A와 B를 가지고있다.상호 제외 및 프로세스 동기화; C++

자원 'A'는 동시에 최대 3 번 처리 될 수 있으며 자원 'B'에 접근하면 상호 제외가 필요하다.

프로세스 X와 Y :

void processX() 
{ 
    while (1) 
    { 
     AccessToResource(B); 

     AccessToResource(A); 
    } 
} 

void processY() 
{ 
    while (1) 
    { 
     AccessToResource(A); 

     AccessToResource(B); 
    } 
} 

내가 할 수있는 방법이 세마포어, 뮤텍스, 이벤트, 가장 짧은 방법을 사용하고 계십니까? 대한

는 지금은

CSemaphore sem(1,5,L"semaph"); 

을 가지고 이전과 리소스에 액세스 할 후) sem.Lock()와 sem.Unlock (하여 사용하고 있지만 그것은 아주 좋지 않다.

+0

그래서 A와 B 모두에 대한 액세스를 동시에 잠글 필요가 없습니까? 각 리소스에 대한 액세스는 다른 리소스와 별도로 처리 할 수 ​​있습니까? –

+0

프로세스 X와 Y가 동시에 실행 중입니다. 나는 그것을 다루는 방법을 모르지만, 그것과 같은 나의 첫 번째 과제이다. – Pawel

+0

@Pawel C++ 표준은 프로세스에 대한 개념이 없으며 표준 라이브러리에는 프로세스 간 통신 API가 없다. 질문에 사용할 API를 지정해야합니다. – user2079303

답변

2

Resource'A '는 최대로 3 proceses 세마포어 여기 적합한 것 계산

을 (wiki 참조)이 사용될 수있다.

어떤 프로세스는 리소스 A를 소유 할 때마다 해당 세마포어를 1 씩 증가시킵니다. 카운트가 3을 초과하면 귀하의 사례에 이미 이미 있음을 의미합니다. 자원 'A'를 사용하는 3 개의 프로세스. 자원 'A'를 사용하여 프로세스가 끝나면 해당 카운터 (semafore)가 1 씩 감소하므로 다른 프로세스가 해당 자원을 사용할 수 있습니다. 자원에 액세스하여

'B'상호 필요 제외 여기서

적합한 용액을 mutex (또는 이진 세마포어) 일 것이다. 둘 다 거의 동일하게 작동합니다. 차이는이므로 mutex에 중점을 둡니다.

+0

'std :: mutex' OP가 실제로 * processes *를 사용하고 스레드가 아닌 경우에는 도움이되지 않습니다. 구현 세부 사항입니다. OP가 구현 특정 응답 또는 일반 응답 (사용자가 제공 한)을 원한다는 것을 알기에는 충분하지 않습니다. –

+0

@Someprogrammerdude 예, 죄송합니다, 방금 C++ 태그로 오도되었습니다. 답변이 수정되었습니다. –

+0

@ Yuriy Ivaskevych 일반적인 답변은 특정 구현으로 괜찮습니다. 나는 그 대답이 나를 위해 충분하다고 생각한다. :) 대단히 감사합니다. – Pawel