본문 바로가기
C#

[C#] 컴파일러 최적화로 인한 데드락 예제

by 소리쿤 2023. 3. 3.
    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 모드로 디버그해보면,

까먹을까봐... 디스 어셈블리 가는 법 스샷
정상 상황일 때 디스어셈블리한 모습
ecx == ecx라면, 07FFB9D55D4A0 로 간다는 구문 > 무한루프

stop이 false 바꿔주는 구문이 while 내에 없으므로 컴파일러가 최적화를 진행함

 

while(isStop == false)
{

}

이었던 코드가

if(isStop == false)
{
	while(true){}
}

아래 같은 형상처럼 바뀐 것임

 

최적화를 막기 위해선 volatile 키워드를 변수에 붙이면 된다고 함

private volatile static bool _stop = false;

volatile을 붙인 후 디스어셈블리한 모습

 

최적화 시 건드리지 않는다. 의 개념으로 알아두면 될 듯 한데,

다른 것도 있나 봄 c#에선 쓰지 말라고 함

'C#' 카테고리의 다른 글

[C#] 메모리 베리어 예제  (0) 2023.03.06
[C#] 캐시 Special Locality 테스트  (0) 2023.03.05
[C#] Thread Join 예제  (0) 2023.02.27
[C#] Task Option LongRunning  (0) 2023.02.27
[C#] internal 한정자  (0) 2022.06.06