코다람쥐 2022. 3. 9. 14:05

1. 멀티쓰레드와 heap영역

멀티쓰레드 개론에서 쓰레드들이 메모리를 사용할 때 heap영역은 동시에 사용한다고 배웠다. 이를 아래의 코드에서 확인해보자.

using System;
using System.Threading;
using System.Threading.Tasks; // Task를 사용하기 위해 선언

namespace ServerCore
{
    class Program
    {
        static bool _stop = false; // heap영역을 사용하기 위한 static 변수 선언

        static void ThreadMain()
        {
            Console.WriteLine("쓰레드 시작!");

            while(_stop == false)
            {
                //누군가가 stop신호를 해주기를 기다린다.
            }
            Console.WriteLine("쓰레드 종료!");
        }
        static void Main(string[] args)
        {
            Task t = new Task(ThreadMain);
            t.Start();

            Thread.Sleep(1000); // 메인쓰레드를 1초동안 정지함.
            // t.Sleep이 아니고 메인쓰레드임!!

            _stop = true;

            Console.WriteLine("Stop 호출");
            Console.WriteLine("종료대기중");
            t.Wait(); // Thread.Join()과 같은 역할을 함. Task에서는 Wait임.

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

위의 코드를 통해 static으로 선언된 _stop이 잘 작동하는걸 알 수 있다.

 

 

2. 최적화 방지

그러나 Debug모드를 Release모드로 바꾸면 코드의 실행이 이상해진다.

Debug모드
Release모드

그 이유는 Release모드로 하면 프로그램이 자동으로 최적화 되기 때문에 의도하지 않은 결과가 나오기 때문이다.

그래서 이러한 최적화를 강제로 막는 여러가지 방법이 있다.

 

volatile키워드

volatile은 휘발성이라는 의미가 담긴 키워드인데, 컴파일러는 휘발성 변수인 것을 보면 사라질 메모리라고 생각하여 최적화를 하지 않게된다. 하지만 c#의 volatile은 휘발성뿐 아니라 여러가지 의미가 더 담겨있는데 그것까지 알아보면 너무 복잡하다. 그리고 c# 전문가들은 웬만하면 volatile키워드를 사용하지 않는 것을 추천한다. 그냥 잊어도 된다.

volatile static bool _stop = false;