2014-03-24 3 views
0

나와 나와 친구들이 온라인으로이 예제 코드를 보았고 중요한 섹션을 구현하는지 여부에 대해 논쟁하고있다. 우리의 의견은 앞뒤로 가고있어 stackoverflow에 대해 생각했다.중요 섹션 예 - 작동합니까?

여기에서 중요한 섹션을 구현할 것인가 말 것인가?

int flagga[2]; 

void task0(void){ 
while(1){ 
/* some code */ 
flagga[0]=true; 
while(flagga[1]==true) /*do nothing*/; 
/* critical sektion */ 
flagga[0]=false; 
} 
} 

void task1(void){ 
while(1){ 
/* some code */ 
flagga[1]=true; 
while(flagga[0]==true) /*do nothing*/; 
/* critical section */ 
flagga[1]=false; 
} 
} 

void main(void){ 
flagga[0]=flagga[1]=false; 
startThread(task0); 
startThread(task1); 
while(1); 
} 
+0

가깝습니다. http://en.wikipedia.org/wiki/Peterson%27s_algorithm –

+0

이 코드와 위키피디아의 코드는 파일 범위 변수를 휘발성으로 선언해야합니다. 그렇지 않으면 컴파일러가 코드를 최적화 할 때 버그가 발생할 수 있습니다. 이것은 스레드 함수가 콜백 함수이기 때문입니다. 따라서 일부 컴파일러는 특정 함수가 호출되었는지 여부를 판별 할 수 없습니다. 컴파일러에서는 이러한 함수가 실행되지 않는 것처럼 보이고 최적화 중에 잘못된 결정을 내리는 것처럼 보일 수 있습니다. 여전히 휘발성 키워드는 하드웨어 메모리 장벽을 제공하지 않으므로 멀티 코어 시스템에 문제가 발생할 수 있습니다. – Lundin

답변

1

것이 가능 기아로 고통 : 어느 작업이 다른 (각 작업의 문 사이에 만약 당신이 stickily 대체 일어날 수있는) true로 flagga을 설정하기 전에 내부 while에 도달하면, 모두에 갇혀 얻을 것이다 내부 while 루프.