🙇‍♀️컴파일러 최적화

🪐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#에서는 특이하고 여러가지를 할수있기에 되도록이면 사용하지말고 메모리베이러, 락, 아토믹을

태그:

카테고리:

업데이트: