C#/C# 서버

[C#/서버] 쓰레드 풀 (ThreadPool)

진서박 2023. 8. 16. 15:05
반응형

인프런 - Rookies님의 강의

https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part4

 

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버 - 인프런 | 강의

네트워크/멀티쓰레드/운영체제 등 핵심 전공 지식을 공부하고 게임 서버를 바닥부터 만들어보면서 MMORPG 기술을 학습하는 강의입니다., MMORPG 개발에 필요한 모든 기술, C# + Unity로 Step By Step! 🕹

www.inflearn.com

 

ThreadPool?

- C#에서만 사용 가능
- 인력사무소의 역할
- 오래걸리는 일이 아닌 단기적인 처리를 할 때 유용
- 오래걸리는 일을 쓰레드 풀에 다 할당해버리면 풀에서 끌어올 쓰레드가 없기에 TO가 날 때 까지 작동이 안됨

 

사용법

ThreadPool.QueueUserWorkItem("처리할 함수");

QueueUserWorkItem

- 실행을 위해 메서드를 큐에 대기시킴

 

최소 쓰레드와 최대 쓰레드 제한

public static bool SetMinThreads(int workerThreads, int completionPortThreads)
public static bool SetMaxThreads(int workerThreads, int completionPortThreads

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

- 최대로 설정한  n개를 모두 사용중이면 다음 요청이 들어오더라도 대기 상태로 유지

 

workerThreads

- 일을 처리할 쓰레드

 

completionPortThreads

- 스레드 풀에 있는 최대 비동기 I/O 스레드 수
- 네트워크 이벤트를 기다린다거나 하는 작업을 하는 쓰레드 갯수 설정

 

 

쓰레드 풀의 단점 : 오래걸리는 일을 할당하면, 전체 시스템이 먹통이 될 수 있음

 

 

쓰레드 풀의 단점을 극복할 방법?

 

Task

- 쓰레드 풀을 효율적으로 관리할 수 있다

 

사용법

Task t = new Task("사용할 함수/매개변수가 Action타입이므로 람다식 사용 시 인자사용 X", TaskCreationOptions.LongRunning);
t.Start();

* 두번째 인자 TaskCreationOptions.LongRunning

- 쓰레드 풀에 들어가긴 하나, 오래 걸리게 되는 별도의 작업이 될 것이다 라는것을 설정
- WorkerThreadPool에서 뽑아서 실행하는것이 아닌, 별도로 처리가 됨

 

 

 

 

 

 

 

정리
1. C#에서는 쓰레드를 직접 관리할 일이 거의 없다
2. ThreadPool을 적극 활용하자
3. 오래걸리는 작업이라면, Thread를 만들 필요 없이 Task로 만들어서 실행해도 충분함

반응형

'C# > C# 서버' 카테고리의 다른 글

[C#/서버] AutoResetEvent / ManualResetEvent  (0) 2023.08.20
[C#/서버] SpinLock  (0) 2023.08.18
[C#/서버] 메모리 배리어  (0) 2023.08.16
[C#/서버] 캐시 이론  (0) 2023.08.16
[C#/서버] 쓰레드 (Thread)  (0) 2023.08.16