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
'C# > 비동기 프로그래밍' 카테고리의 다른 글
| UI 쓰레드 마샬링 Invoke / BeginInvoke (0) | 2026.04.08 |
|---|---|
| 병렬 프로그래밍 문법(3): Thread 동기화 - lock, interLock, Monitor 클래스 (0) | 2026.04.08 |
| 비동기 프로그래밍의 패턴과 문법: APM(Begin/End), EAP(이벤트 기반), TAP(Task, async/await) (0) | 2026.04.05 |
| 병렬 프로그래밍 문법(1): Thread (0) | 2026.04.03 |
| 동시성과 비동기 프로그래밍 이해: Thread, ThreadPool, Task, async/await (0) | 2026.04.01 |