프로그래밍/C# 게임서버

컴파일러 최적화

sleepyotter. 2021. 9. 7. 19:29

전역으로 선언된 변수는 모든 스레드들이 동시에 접근 가능하다.

Thread.Sleep(x ms)를 넣어주면 함수를 호출한 Thread를 x ms만큼 멈춘다.

Task t; t.wait()를 호출하면 해당 task가 종료될 때까지 기다린다. Thread의 경우에는 t.join() 이 된다.

while(_stop==false)
{
	//waiting for true _stop
}

와 같은 코드를 Release모드로 실행하게 되면

if(_stop==false)
	while(true) {}

와 같이 컴파일러가 최적화 시켜버리는 경우가 있다. 이런 경우에는 다른 곳에서 _stop을 변경시켜 while을 빠져나와야 하는데 그렇지 않다.

이것을 막기 위해서는 _stop 선언에 volatile을 추가해준다. 해당 키워드는 이 값은 캐싱된 값을 사용하지 말고 매 번 메모리에서 새 값을 가져오라는 뜻이다.

C#에서는 웬만하면 사용하지 않는 것을 권장하고 있다.