UnityServer - 쓰레드 생성

k_hyun·2022년 10월 17일
0

Unity_Server

목록 보기
1/32

쓰레드 생성

using System;
using System.Threading;

namespace SeverCore
{
    internal class Program
    {
        static void MainThread()
        {
            for (int i=0; i<5; i++)
                Console.WriteLine("Hello Thread!");
        }

        static void Main(string[] args)
        {
            Thread t = new Thread(MainThread);
            t.Start();
            t.Join();
            Console.WriteLine("Hello World!");
        }
    }
}

쓰레드를 생성해서 실행하여 보았다.

new를 통해 쓰레드를 생성하는 것은 정규직을 고용하는 것과 같다. 관리가 번거로움.

Join() 함수는 쓰레드가 실행되고 끝날때까지 뒤의 작업이 대기상태가 된다.

ThreadPool

using System;
using System.Threading;

namespace SeverCore
{
    internal class Program
    {
        static void MainThread(object state)
        {
            for (int i=0; i<5; i++)
                Console.WriteLine("Hello Thread!");
        }

        static void Main(string[] args)
        {
            ThreadPool.SetMinThreads(1, 1);
            ThreadPool.SetMaxThreads(5, 5);

            

            for (int i=0; i<5; i++)
            {
                ThreadPool.QueueUserWorkItem((object obj) => { while (true) { } });
            }
			ThreadPool.QueueUserWorkItem(MainThread);
            
            Console.WriteLine("Hello World!");
        }
    }
}

ThreadPool.set을 통해 최소, 최대 쓰레드의 수를 정하였다.

ThreadPool은 단기 알바를 사용하는 것과 유사하다.

ThreadPool.QueueUserWorkItem()을 통해 함수를 쓰레드를 이용해서 실행 할 수 있다.

위의 경우 5개의 쓰레드가 무한루프를 도는 람다 함수를 실행하고 이후에 MainThread를 실행하도록 되어있다.

쓰레드 5개가 다 사용중이고 반납되지 않으므로 MainThread 함수는 실행되지 않는다.

Task

static void Main(string[] args)
        {
            ThreadPool.SetMinThreads(1, 1);
            ThreadPool.SetMaxThreads(5, 5);


            for (int i=0; i<5; i++)
            {
                Task t = new Task(() => { while (true) { } }, TaskCreationOptions.LongRunning);
                t.Start();
            }

            ThreadPool.QueueUserWorkItem(MainThread);

            Console.WriteLine("Hello World!");
        }

Task의 경우 Thread와 비슷하나, LongRunning 옵션을 줘서 작업 순서를 뒤로 늦춘다.

따라서 MainThread가 실행됨을 확인 할 수 있었다.

0개의 댓글