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
이 있지만 좀 다르게 동작(최적화 하지말라는 동작)
- 좀 더 정확히 말하면
- 이번강의에서 하고싶은 말은 컴파일러에서 이러한 방법으로 최적화가 일어나고 따라서 멀티쓰레드 환경에선 주의해서 코드를 짜야한다는 것