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