C# Rookiss Part4 게임서버 : 컴파일러 최적화
🙇♀️컴파일러 최적화
🪐Sleep, Wait
static bool _stop = false;
static void ThreadMain()
{
Console.WriteLine("Thread Start!");
while (_stop == false)
{
// stop wait
}
Console.WriteLine("Thread End!");
}
static void Main(string[] args)
{
Task t = new Task(ThreadMain);
t.Start(); // 일꾼 일 시작
Thread.Sleep(1000); // 일초 쉬기
_stop = true;
Console.WriteLine("call stop");
Console.WriteLine("Waiting stop");
t.Wait(); 쓰레드의 Join 과 비슷함
Console.WriteLine("Stop Clear!");
}
-
Thread Start! -> Thread End! -> call stop -> Waiting stop -> Stop Clear! 순으로 출력
-
디버그모드에선 정상적으로 출력
-
릴리즈모드에선 비정상적으로 출력
if (_stop == false)
{
while (true)
{
// stop wait
}
}
while 부분이 최적화 되면서 위와 같이 바뀐다 그러므로 while을 빠져나가지 못함
- Thread Start! -> call stop -> Waiting stop 출력후 먹통
🪐volatile
_stop을 휘발성 데이터로 만들어야 됨
volatile static bool _stop = false;
- _stop은 휘발성 데이터이므로 최적화 하지말아라
c++에서도 최적화를 못하게 하는 역할이 있음 c#에서는 추가로 캐시를 무시하고 최신값을 가져오는 역할도 함 c#에서는 특이하고 여러가지를 할수있기에 되도록이면 사용하지말고 메모리베이러, 락, 아토믹을