[C#] 쓰레드

수민·2023년 6월 5일
0

게임서버 이론

목록 보기
1/6
post-thumbnail

인프런 강의 를 듣고, 개인 공부 목적으로 정리한 글입니다.


쓰레드 생성

static void MainThread(object state)
{
	...
}
static void Main(string[] args)
{
   Thread t = new Thread(MainThread);
   t.Name = "Test Thread";                         // 스레드 이름 지정
   t.IsBackground = true;                          // 백그라운드에서 실행 - 메인이 끝나면 종료된다. (디폴트 : false)
   t.Start();

   Console.WriteLine("Waiting for Thread!");

   t.Join();                                       // 스레드 t의 종료를 기다린다. 끝나면 다음 실행
}

함수 및 사용법

new Thread를 통해 쓰레드를 생성한다.

t.Name = "Test Thread" : 쓰레드 이름 생성
디버깅 할 때 편리하다

t.IsBackground : 쓰레드가 백그라운드에서 실행될지 여부를 결정한다.
기본값은 false

t.Start() : 쓰레드 실행
t.Join() : 쓰레드의 종료를 기다린다.

cw tab 하면 Console.WriteLine();이 자동으로 완성된다 나이스


쓰레드 풀

풀링

창고에 넣어 놨다가 필요할 때 꺼내서 쓴다는 개념
쓰레드 풀에 쓰레드들을 넣어놓고, 필요할 때 남아있는 애들을 꺼내서 쓴다.

new Thread로 쓰레드를 생성하면 온전히 책임지며 관리해줘야 한다...

쓰레드 풀의 특징

  • 최대 쓰레드 개수 제한이 있다.
    너무 많은 개수의 쓰레드 실행을 요구해봤자 의미 없다.
    어차피 기존 작업을 하던 쓰레드가 끝나야 실행할 수 있다. (실행할 남은 쓰레드가 없으니까)

함수 및 사용법

static void Main(string[] args)
        {
            ThreadPool.SetMinThreads(1, 1);                 // 인자 1 : 일을 할 아이
            ThreadPool.SetMaxThreads(5, 5);                 // 최대 쓰레드 = 5개. 그 이상은 실행안됨

            ThreadPool.QueueUserWorkItem(MainThread);

            while(true) 
            { 
            }
        }
    }

ThreadPool.SetMinThread() : 쓰레드 최소 개수 지정
ThreadPool.SetMaxThread() : 쓰레드 최대 개수 지정

SetMaxThread로 지정한 개수를 넘어선 쓰레드는 실행될 수 없다.
(사실 위 두 함수를 사용하지 않아도 알아서 지정해주기는 한다)

ThreadPool.QueueUserWorkItem() : 쓰레드에게 일을 던져준다.
위 코드에 있는 MainThread를 넣어주면 된다.
여기서는 Object가 실행하도록 해야 하므로
위 MainThread의 인자에 Object를 넣었다.

Task

쓰레드가 할 일감을 정의한다.
쓰레드 풀에 넣어서 사용할 수 있다.

쓰레드의 경우,
한 쓰레드에 일이 과도하게 몰리면 다른 쓰레드가 점유되지 못하면서 문제가 발생할 수 있다.

Task는 작업 단위로 일을 시킬 수 있으니까
쓰레드에게 적절히 분배하기 좋다.

기본적으로 작업 단위로 수행시키려면, Task를 사용한다.
오래걸리는 작업, 무거운 작업이 아닌 간단한 일들.

LongRunning 옵션

Task에 지정한 일이 오래 걸리는 작업이라면, 인자로 옵션을 넣어주면 된다.

Task t = new Task(() => { while (true) { } }, TaskCreationOptions.LongRunning);
t.Start();

이렇게
TaskCreationOptions.LongRunning 옵션을 넣어주게 되면,
오래 걸리는 작업이라는 것을 알려주게 되고
별도의 쓰레드를 만들어서 해당 일을 처리한다.
그래서 쓰레드 풀에서는 문제 없이 다른 일을 병렬적으로 실행할 수 있다.


TLS (Thread Local Storage)

: 쓰레드마다 고유하게 접근할 수 있는 전역변수

Stack 영역에 선언한 지역변수처럼 다른 쓰레드와 관련없이 고유한 값을 가지지만,
Stack과 달리 휘발성이 없고 반영구적으로 안전하게 사용할 수 있다.

특정 쓰레드만 사용할 정보들을 저장하기에 좋다.

장점

전역 (공용 공간)에 접근할 횟수를 줄일 수 있다.
: 전역에서 한 번에 여러 개의 데이터를 가져와서
로컬에서 Lock 없이 편하게 실행하면 lock을 줄일 수 있다.

사용법

ThreadLocal<> : 쓰레드마다, 접근하면 자신만의 공간(local)에 저장됨

예)

static ThreadLocal<string> ThreadName = new ThreadLocal<string>();

Parallel.Invoke() : 쓰레드를 병렬적으로 실행할 수 있게 한다.

변수명.Dispose() : 필요없을때 해제해준다

profile
우하하

0개의 댓글