본문 바로가기
C#/비동기 프로그래밍

병렬 프로그래밍 문법(2): ThreadPool

by Sein_ 2026. 4. 8.
728x90

Thread 동작 방식

스레드는 실행 방식에 따라 두 가지 형태로 나눌 수 있다.

 

1) 상시 실행

스레드가 생성된 이후 종료되지 않고 오랜 시간 유지되는 방식이다.
주로 무한 루프 형태로 동작하며, 지속적으로 작업을 수행한다.

일반적인 애플리케이션에서는 사용이 제한적이다.

 

2) 일회성 실행

특정 작업을 수행한 후 바로 종료되는 방식이다.

스레드는 운영체제(OS)의 커널 자원으로 관리되므로 스레드를 생성하고 종료하는 과정은 비용이 크다.

자주 생성/삭제할 경우 성능 저하가 발생할 수 있다.

 

스레드 풀 (ThreadPool)

위와 같은 문제를 해결하기 위해 ThreaPool을 사용한다.

ThreaPool은 미리 생성된 스레드를 재사용하여 스레드 생성/삭제 비용을 줄이는 방식이다.

 

재사용할 스레드가 없으면 새로운 스레드를 생성하고, 있으면 해당 스레드를 재사용한다.
또한 사용한 스레드는 다시 스레드풀로 반환되어 재사용 가능한 상태가 된다.
따라서 스레드 생성/종료를 직접 관리할 필요 없이 작업 자체에 집중할 수 있다.


 

 

스레드 풀 시작

스레드 풀을 사용하려면 System.Threading 네임스페이스가 필요하다.
프로세스에는 기본적으로 메인 스레드가 존재하며 추가적인 작업은 ThreadPool을 통해 실행할 수 있다.

 

매개변수가 없는 스레드풀 실행

ThreadPool은 새로운 스레드를 생성하지 않고, 미리 생성된 스레드를 재사용하여 작업을 실행한다.
따라서 Thread와 달리 new Thread()나 Start()를 사용하지 않는다.

 

- QueueUserWorkItem

ThreadPool에 작업을 등록하는 메서드이다.

public static bool QueueUserWorkItem(WaitCallback callBack);
public static bool QueueUserWorkItem(WaitCallback callBack, object state);

 

- WaitCallback
ThreadPool에서 실행할 메서드를 전달하기 위한 델리게이트이다.

메서드를 넘기면 델리게이트로 자동 변환되기 때문에 생략이 가능하다.

// 생략형 (델리게이트 자동 변환)
ThreadPool.QueueUserWorkItem(TestThreadPool);
ThreadPool.QueueUserWorkItem(TestThreadPool, 10);

// 풀버전
ThreadPool.QueueUserWorkItem(new WaitCallback(TestThreadPool));

 

동작 흐름

1) QueueUserWorkItem 호출
2) ThreadPool에 작업 등록
3) 사용 가능한 스레드가 해당 작업 실행

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        // 스레드풀에 작업 등록
        ThreadPool.QueueUserWorkItem(TestThreadPool); // state : null
        Console.ReadLine();
    }

    static void TestThreadPool(object state)
    {
        Console.WriteLine("스레드풀 시작");
    }
    
}

 

스레드 풀 실행 순서

ThreadPool에서 실행되는 작업도 실행 순서가 보장되지 않는다.
QueueUserWorkItem은 실행 요청일 뿐 즉시 실행을 의미하지 않는다.
실제 실행 순서는 OS 스케줄러가 결정하며, 어떤 작업이 먼저 실행될지는 예측할 수 없다.

for (int i = 0; i < 10; i++)
{
ThreadPool.QueueUserWorkItem(TestThreadPool, i);
}

 

실행 결과는 매번 달라질 수 있다.

3 번째 작업
1 번째 작업
7 번째 작업
0 번째 작업
...

 

 

 

https://m.blog.naver.com/i_am_gamer/223447576503?recommendTrackingCode=2

 

유니티 강의 - ThreadPool (스레드풀)

프로그래밍에서 풀(pool)이라는 용어는 일반적으로 "재사용할 수 있는 자원의 집합"을 의미합니...

blog.naver.com