C#
[C#] 컴파일러 최적화로 인한 데드락 예제
소리쿤
2023. 3. 3. 00:08
class Program
{
private static bool isStop = false;
static void Main(string[] args)
{
Task t = new Task(MainRun);
t.Start();
Thread.Sleep(1000);
isStop = true;
Console.WriteLine("서브 스레드 Stop 호출");
t.Wait();
Console.WriteLine("메인 스레드 종료");
}
static void MainRun()
{
Console.WriteLine("서브 스레드 시작");
while(isStop == false)
{
}
Console.WriteLine("서브 스레드 종료");
}
}
단순히 봤을 땐 문제 없으나, Release 모드로 디버그해보면,
stop이 false 바꿔주는 구문이 while 내에 없으므로 컴파일러가 최적화를 진행함
while(isStop == false)
{
}
이었던 코드가
if(isStop == false)
{
while(true){}
}
아래 같은 형상처럼 바뀐 것임
최적화를 막기 위해선 volatile 키워드를 변수에 붙이면 된다고 함
private volatile static bool _stop = false;
volatile을 붙인 후 디스어셈블리한 모습
최적화 시 건드리지 않는다. 의 개념으로 알아두면 될 듯 한데,
다른 것도 있나 봄 c#에선 쓰지 말라고 함