본문 바로가기
게임 서버/Thread

[c#/유니티] 컴파일러 최적화

by 얘리밍 2022. 12. 6.
320x100
728x90

스레드에 이어서... 

 

다음과 같이 스레드를 작성하고

debug 모드로 실행하면 정상적으로 실행되는 것을 볼 수 있다. 

 

 

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ServerCore
{
    class Program
    {
        static bool _stop = false; //모든 스레드가 동시에 접근함 
        static void ThreadMain()
        {
            Console.WriteLine("쓰레드 시작!");  //단축키 : cw를 치고 tab 두번 누르기
            while(_stop == false)
            {
                //누군가가 stop 신호를 해주기를 기다림

            }
            Console.WriteLine("쓰레드 종료!");

        }
        static void Main(string[] args)
        {
            Task t = new Task(ThreadMain);
            t.Start();

            Thread.Sleep(1000); //1초 동안 대기 

            _stop = true;

            Console.WriteLine("Stop 호출");
            Console.WriteLine("종료 대기중");
            t.Wait(); //스레드가 종료 되었는 지 확인 (thread 사용 시에는 Join 사용, Task 사용 시에는 wait 사용)

            Console.WriteLine("종료 성공");
          

     
        }
    }
}

 

 

 

 

 

debug 모드를 release 모드로 변경하면 최적화가 진행된다. 

 

 

 

 

release 모드로 변경하고 다시 디버깅을 하면 

 

 

 

위와 같이 종료 대기중에 멈춰 있는 것을 볼 수 있다. 

Wait()에서 돌아오지 않고 스레드메인의 무한 루프를 돌고 있을 것이다...

 

 

 

 

이처럼 멀티 스레드를 만들 때, release 모드로 최적화 하면 debug에서는 되는 것이

안되는 경우가 발생할 수 있다. 

 

 

왜냐..

 

스레드 안의 while문을 다음과 같은 로직으로 받아들이기 때문이다. 

 

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

 

 

 

이 때, volatile을 함께 선언해주면 최적화 되는 것을 막을 수 있다. 

 

다음과 같이 정상적으로 실행된다... 

(하지만 사용 추천하지 않음) 

 

 

 

 

 

 

                         출처 : https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part4

728x90
반응형