반응형

Intro

프로세스에서 스레드를 생성과 삭제를 반복하면 스레드 생성에 대한 오버헤드가 발생하게 된다.

그래서 스레드 풀을 생성하고 스레드 작업이 필요한 경우에 스레드를 꺼내와 사용하고 

작업이 끝나면 해제되는 것이 아니라 스레드 풀에 돌려주는 형식으로 성능 향상을 기대하게 된다.

 

Intro - example

예로 적합하지 않을 수도 있지만, 수영장에 간다고 생각해보자.

수영장에 갈때, 구명 조끼를 반드시 입어야한다는 규칙이 있다고 가정해보면

수영장에 갈때마다 구명 조끼를 구매하러 마트에 가서 구매하고 수영장으로 가는 것보다

수영장으로 가서 구명 조끼를 빌리는 시간이 더 적게 걸릴 것이다.

 

생성(마트에 가서 구명 조끼 구매) -> 수영장 

수영장(구명 조끼 대여) -> 반납

 

이런 느낌으로 생각하면 쉽게 이해가 되지 않을까 생각이 들었다. (최근에 수영장 갔다온 입장에선..)

 

Intro - result

결론적으로 이야기 하자면, C#에서는 언어 레벨에서 스레드풀을 지원해준다.

스레드 풀의 큐에 넣으면 내부적으로 스레드를 생성하거나 기존 생성되어 있던 스레드를 가져와서 수행 후, 스레드를 삭제하는 것이 아니라 대기 상태로 유지해준다.

그리고 ThreadPool 에는 여러 기능들을 제공하여 준다. 

C++ 개발자였던 나로써 C#의 ThreadPool을 접하였을 때, 정말 편리하다고 느껴졌다.


ThreadPool 사용

기본적인 예시로 ms doc에서 가져온 예시를 조금 수정하여 사용하였다.

namespace ServerCore
{
    class Program
    {
        static void MainThread(object state)
        {
            Console.WriteLine($"{state}");
        }

        static void Main(string[] args)
        {
            ThreadPool.QueueUserWorkItem(MainThread, "Hello from the thread pool.");
            Console.WriteLine("Main thread does some work, then sleeps.");

            Console.WriteLine("Main thread exits.");
        }
    }
}
  • ThreadPool에 작업을 요청하기 위해서는 리턴 타입 void, object를 인자로 받는 메소드 형태여야 한다.
  • ->그렇지 않으면 에러 표시를 띄워준다.
  • ThreadPool에 작업을 요청하기 위해선 QueueUserWorkItem 메소드를 이용한다.
  • 아무런 인자도 지정하지 않으면 arg인자로 null이 전달된다.  ex) ThreadPool.QueueUserWorkItem(MainThread);

ThreadPool의 단점

  • 풀링을 이용하여 스레드 자원의 생성과 삭제 오버헤드를 줄여주고, 스레드 개수를 유지 할 수 있다는 장점이 있는 반면, 경우에 따라 분명 단점도 존재하고 있다.
  • Name 필드 사용 불가능 ( ThreadPool 내의 스레드 재사용 가능성 때문에 특정한 이름을 지정하는것이 불가능)
  • ThreadPool에서 생성되는 스레드들은 항상 백그라운드 스레드다.
  • C# 프로세스 종료 시점은 "모든 foreground 스레드가 종료되는 시점"이다. 하지만, ThreadPool에서 생성되는 스레드들은 모두 background 스레드이다. 따라서 ThreadPool에서 아직 작업중인 스레드가 있다고 하더라도 프로세스는 종료 될 수 있다. 또한 Thread의 Join과 같은 메소드도 사용할 수 없기 때문에 프로세스 종료 시점까지 대기 할 수도 없다. 
  • ThreadPool은 작업의 완료 여부를 알 필요없는 작업을 처리하는데 주로 사용된다.

Extro

C#을 공부하다 보니, 정말 신기한게 너무 많았다.

C#을 사용하는 프로젝트에서 일하는 동생에게 듣기로는 Task로 사용한다고 해서 그 이전에 한번 공부하고 싶은 마음에

보다 보니, ThreadPool 이라는 것도 있어서 살펴보았는데, 단점으로 인하여 메인으로 쓰기에는 부적합하다고 생각이 들었다. 빨리 C# 게임 서버를 만들어보면서 이것저것 공부해봐야겠다고 생각이..!!

예전에는 자세하게 많이 넣어뒀지만, 회사를 다니면서는 도큐먼트 보는게 습관이 되서 도큐먼트의 예시를 보고 직접 해보는게  습관이 들어서 사이트만 첨부를.. 나중에 또 궁금해지면 살펴봐야겠다.


참고 사이트

https://docs.microsoft.com/ko-kr/dotnet/api/system.threading.threadpool?view=net-6.0

반응형

'C, C++' 카테고리의 다른 글

[C++] istringstream, ostringstream, stringstream  (0) 2023.04.25
[C#] delegate (대리자)  (0) 2022.10.11
[C/C++]explicit  (0) 2021.12.01
[C/C++]스마트 포인터(smart pointer)  (0) 2021.11.22
[C/C++] accumulate 사용법과 주의사항  (0) 2021.07.09

+ Recent posts