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#에선 쓰지 말라고 함
'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 |