(C# : Server) 3. 컴파일러 최적화

Posted by : at

Category : Charp-Server


static bool stop = false;

static void ThreadMain()
{
    Console.WriteLine("쓰레드 시작!");

    while(stop == false)
    {
        /*
        컴파일러 입장에서는 이렇게 최적화를 한다
        if(stop == false)
        {
            while(true)
            {}
        }
        컴파일러 입장에선 그럴만도 한게 내부에서 stop을 true로 바꿔줄 만한 요소가 없음.
        따라서 릴리즈 모드에서 무한루프에 빠지게 된다.
        */
    }

    Console.WriteLine("쓰레드 종료!");
}

static void Main(string[] args)
{
    Task t = new Task(ThreadMain);

    t.Start();

    Thread.Sleep(1000); // Thread가 시작할 수 있는 시간을 대기
    _stop = true;

    Console.WriteLine("Stop 호출");
    Console.WriteLine("종료 대기중");
    t.Wait();   // Join
    Console.WriteLine("종료 성공");
}

이걸 릴리즈 모드(최적화가 적용된 모드)로 실행시 문제가 발생한다.

해결해보자

// ...

// volatile 지정하기
volatile static bool stop = false;

// ...
  • 사실 이번강의는 volatile를 알려주려는 목적이 아니다.
    • 좀 더 정확히 말하면 volatile의 사용은 추천하지 않는다
    • volatile은 코드를 최적화 하지말라는 말이 아니라 실시간으로 변수를 가져와 달라는 명령이다.
    • 물론 C++에서도 volatile이 있지만 좀 다르게 동작(최적화 하지말라는 동작)
  • 이번강의에서 하고싶은 말은 컴파일러에서 이러한 방법으로 최적화가 일어나고 따라서 멀티쓰레드 환경에선 주의해서 코드를 짜야한다는 것

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links