새소식

⇥ 2D Game/Network

게임서버 만들기 - 쓰레드 생성

  • -
반응형

1. Thread

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

 

Thread t = new Thread(MainThread);
t.Name = "Test Thread";
t.IsBackground = true;
t.Start();

MainThread 라는 메서드를 정의하고, 해당 메서드를 실행하는 Thread 를 실행한다. 기본적으로 foreground 로 실행되기 때문에,
IsBackGround 를 true 로 변경하면 백그라운드에서 실행되며, Start 로 스레드를 실행시킬 수 있다.

 

2. Thread Pool

하지만 스레드가 필요할 때마다 위에 처럼 하나하나 지정해서 생성하면 관리가 어려워지게 된다.
그래서 ThreadPool 이라는 기능이 존재한다. Thread 를 자동으로 생성해주고 Pool 로 관리해줌.

ThreadPool.SetMinThreads(1, 1);
ThreadPool.SetMaxThreads(5, 5);

//background
for (int i = 0; i< 5; i++)
    ThreadPool.QueueUserWorkItem(MainThread);

ThreadPool.QueueUserWorkItem(MainThread);

최소 1개 ~ 최대 5개를 가지도록 Set*Threads 메서드로 지정해준다.
그리고 QueueUserWorkItem 메서드로 MainThread 함수를 지정해준다.
(QueueUserWorkItem 인자가 callback 으로 여기서 지정해주려고 매개변수로 obj를 받는다.)

이렇게 되면 5개의 MainThread 가 실행되고 만약 MainThread 가 5개 모두 진행중이면 마지막에는 할당되지 못하고 기다리게 된다.

 

3. Task

Task 는 일감의 단위로 Thread 에 할당을 쉽게하고 다른 옵션을 지정해줄 수 있다.

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

위와 같이 Task 로 함수를 지정하고, TaskCreationOptions.LongRunning 을 지정해주면 5개의 스레드가 돌지만 긴 작업이라고 명시해놓았기 때문에 이후 ThreadPool 에서 하나를 추가 요청해도 할당되어 다음 작업이 진행된다.

LongRunning 옵션이 태스크를 일반적인 스레드 풀 스레드 대신 전용 스레드를 사용하여 실행하도록 지시하기 때문이다.

반응형

'⇥ 2D Game > Network' 카테고리의 다른 글

게임서버 만들기 - 쓰레드와 컴파일러, volatile  (1) 2024.06.12
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.