2010-06-16 5 views
1
proces P0:        proces P1: 
while (true)       while (true) 
{          { 
    flag[0] = true;       flag[1] = true; 
    while (flag[1])       while (flag[0]) 
    {          { 
    flag[0] = false;      flag[1] = false; 
    flag[0] = true;       flag[1] = true; 
    }          } 
crit0();         crit1(); 
flag[0] = false;       flag[1] = false; 
rem0();         rem1(); 
}          } 

위의 코드가 진행 요구 사항을 충족하고 대기 상태에 도달했는지 증명할 수있는 상황 전환 스위치가있는 시나리오를 제공 할 수 있습니까?크리티컬 섹션 문제

그리고 사람이 나에게 코드 진행의 요구 사항 또는 대기 (아마도 기아, 교착 상태 및 후 당신에게 후 포함) 두 프로세스에서 일어나고

+1

* 기침 * 숙제 * 기침 * –

+0

그래 그것은 숙제이고 난 이미 awnser을 가지고 있지만 난 내일 우리는 시험이 그것을 얻을하지 않고 내가 알 필요가 이 .. – ambiance

+0

귀하의 구문에 혼란 스러워요. crit0과 crit1 함수가 같은 임계 영역에 들어가 있습니까? 서로 다른 중요 섹션이 있으면 기다릴 필요가 없습니다. – bshields

답변

2

을 유계을 충족하는 경우 감지하는 방법에 대한 몇 가지 팁을 제공 할 수 있습니다 동시.

여기서 두 가지 프로그램을 실제로 동기화하는 것이 없기 때문에 사이에 뭔가가 생길 수 있습니다. 줄 사이에 있습니다. 동일한 메모에서 가능한 일이 동시에 발생합니다. 이 상황에 대해 생각,이 문제가 될 수있는 방법을 보려면

...

첫 번째 플래그 [0] 진정한 = 첫 번째 플래그 [1] 사실은 P0/P1에 일어난 = 경우에 어떤 일이 일어날 것이라고 정확히 같은 시간에?

프로세스 1과 프로세스 2 모두 while 루프에 걸릴 것입니다. while 루프는 어떻게 종료합니까? 한 프로세스는 다른 프로세스가 플래그 [me]를 true로 설정하는 것과 똑같은 순간에 ([플래그] [기타] 동안) 확인해야합니다. 이것은 매우 좁은 시간 범위입니다. 주사위를 반복해서 굴리는 것과 같으며 일정한 숫자를 치기 전까지는 계속하지 않습니다.

이것이 우리가 우리를 위해 동기화를 처리하기 위해 더 높은 수준의 것을 필요로하는 이유입니다. 실제 잠금 장치 등입니다.

편집 : 오, 다른 것. 읽기/쓰기 작업이 스레드로부터 안전한지 확인해야 할 수 있습니다. 시스템이 비트를 읽으려고 시도 할 때 비트에 쓰려고하면 어떻게됩니까?

EDIT2 : 참고 - http://msdn.microsoft.com/en-us/library/aa645755(v=VS.71).aspx

관련 문제