Thread의 기본 생성
 - Thread 생성시 넣은 함수가 종료되면 Thread도 같이 종료된다.

static void MainTread()
{
    Console.WriteLine("Hello Thread");
}

static void Main(string[] args)
{
    // Thread 생성 (생성된 Thread가 동작시킬 함수)
    Thread t = new Thread(MainTread);
    // Thread 시작
    t.Start();

    Console.WriteLine("Hello world");
}

C#의 Thread는 Default로 Foreground로 생성된다.
 - 이 경우 Thread가 종료되지 않으면 프로그램이 종료되지 않는다.
 - isBackground = true 해줄 경우 Thread가 background로 실행되기 때문에 프로그램 종료와 함께 종료된다.

        static void MainTread()
        {
            while(true)
                Console.WriteLine("Hello Thread");
        }

        static void Main(string[] args)
        {
            // Thread 생성 (생성된 Thread가 동작시킬 함수)
            Thread t = new Thread(MainTread);
            t.IsBackground = true;
            // Thread 시작
            t.Start();

            Console.WriteLine("Hello world");
        }

생성한 Thread가 종료되기전까지 프로그램이 종료되지 않는다. / isBackground = true일 경우 프로그램이 종료되면 Thread도 종료된다.

Thread가 Background로 실행되고 있어도 Join()함수를 통해 해당 Thread가 종료될때까지 프로그램을 대기시킬 수 있다.

        static void MainTread()
        {
            while(true)
                Console.WriteLine("Hello Thread");
        }

        static void Main(string[] args)
        {
            // Thread 생성 (생성된 Thread가 동작시킬 함수)
            Thread t = new Thread(MainTread);
            t.IsBackground = true;
            // Thread 시작
            t.Start();
            Console.WriteLine("Waiting for Thread");
            // background Thread가 종료될때 까지 대기
            t.Join();

            Console.WriteLine("Hello world");
        }

디버깅을 통해 현재 Thread상태 확인하기
 - 프로그램 실행중 "정지"버튼을 누르고 Thread를 선택하면 해당 Thread의 동작지점이 표시된다.

Thread Pool
 - 프로그램 동작 중 간단한 작업을 위해 잦은 Thread 생성이 필요한 경우 사용하면 좋음.
 - C#에서 미리 Poolling해둔 Thread를 가져다가 사용하고 해당 Thread가 종료되면 자동으로 Pool로 반납됨
 - 대신 ThreadPool에서 가져온 Thread를 오래 사용할 경우 ThreadPool로 반납이 안되어, ThreadPool의 Thread가 부족해질 수 있고, 그럴경우 ThreadPool이 동작하지 않는 상황 발생.
 - 그래서 간단한 작업을 할때 사용하자.

        static void MainTread(object state)
        {
            for(int i = 0; i<5; ++i)
                Console.WriteLine("Hello Thread");
        }

        static void Main(string[] args)
        {
            ThreadPool.QueueUserWorkItem(MainTread);

            while (true)
            {

            }
        }

Thread Pool의 Max개수만큼 Thread를 사용하고 반납이 안될경우 더 이상 추가 Thread할당이 안됨

Task
 - TheadPool에서 Thread를 할당 받아 사용.
 - 하지만 Task생성시 옵션으로 "TaskCreationOptions.LongRunning"을 설정해 줄 경우 ThreadPool에서 할당하지 않고 별도의 Thread를 생성하여 할당하기 때문에 Thread Pool의 부족현상을 해결 할 수 있다.
 - "TaskCreationOptions.LongRunning" 옵션을 넣지 않으면 ThreadPool에서 할당한다.
 - 따라서 Task위주로 Thread를 활용하고 오래걸리는 작업일 경우 Task생성시 "TaskCreationOptions.LongRunning"를 넣어주자.

'프로그래밍 > 네트워크' 카테고리의 다른 글

SpinLock  (0) 2021.09.01
Lock  (0) 2021.08.29
Race Condition  (0) 2021.08.29
Cache  (0) 2021.08.27
Thread란?  (0) 2021.08.26

+ Recent posts