본문 바로가기
공부/게임서버

컴파일러 최적화에 따른 문제

by samosa 2024. 11. 9.

디버그 모드에서는 아무 문제가 없던 이 코드가,

namespace ServerCore;

internal class Program
{
    private static bool _stop = false; // 전역으로 선언된 변수는 모든 스레드에서 접근 가능. 아래 Main과 ThreadMain에서 접근

    private static void ThreadMain()
    {
        Console.WriteLine("ThreadMain: Start");
        while (!_stop)
        {
            // 누군가가 _stop을 true로 만들 때까지 아무것도 하지 않고 대기
        }

        Console.WriteLine("ThreadMain: Stop");
    }

    private static void Main(string[] args)
    {
        var t = new Task(ThreadMain);
        t.Start();
        
        Thread.Sleep(1000);
        
        _stop = true;

        Console.WriteLine("Main: Stop");
        
        t.Wait(); // thread의 join과 같은 역할
        
        Console.WriteLine("Main: End");
    }
}

 

릴리즈 모드에서는 무한 루프에 빠지게 되는 현상이 있을 수 있다. 왜냐하면 컴파일러 최적화 때문인데,

 

if (_stop != false)
{
    while (true)
    {
        // Infinite loop
    }
}

처럼 처리될 수 있다는 것.

 

해결에 필요한 동기화 메커니즘(Interlocked, CancellationToken, ManualResetEvent 등)은 차차 알아보자.