반응형
C#의 ThreadPool
ThreadPool은 C#의 .NET Framework와 .NET Core에서 제공하는 기능으로, 작업(Work Items)을 처리하기 위해 재사용 가능한 스레드 풀을 관리하는 클래스입니다. System.Threading.ThreadPool 네임스페이스에 정의되어 있으며, 애플리케이션의 성능을 높이고 스레드 관리의 복잡성을 줄이는 데 사용됩니다.
ThreadPool의 주요 개념
- 스레드 풀(Thread Pool)이란?
- 스레드 풀은 **미리 생성된 스레드의 풀(pool)**입니다. 새 작업 요청이 있을 때마다 새 스레드를 만드는 대신, 기존에 생성된 스레드를 재사용합니다.
- 이렇게 함으로써 스레드 생성 및 삭제로 인한 비용을 줄이고, 자원 낭비를 방지합니다.
- ThreadPool의 작동 방식
- 작업이 요청되면, 스레드 풀이 대기 중인 스레드 중 하나를 할당하여 작업을 수행합니다.
- 작업이 끝나면 해당 스레드는 다시 스레드 풀로 반환되어 다음 작업에 사용됩니다.
- 작업이 너무 많아 모든 스레드가 사용 중인 경우, 작업은 **큐(queue)**에 대기 상태로 들어갑니다.
- ThreadPool의 관리
- 최소 스레드 수와 최대 스레드 수를 설정할 수 있습니다.
- .NET은 기본적으로 I/O 작업과 CPU 작업에 대해 별도의 스레드 풀을 관리합니다.
ThreadPool의 장점
- 성능 향상
- 스레드를 직접 생성하거나 제거하는 작업 없이, 미리 준비된 스레드를 재사용하여 성능을 최적화합니다.
- 쉬운 사용
- 복잡한 스레드 생성 및 관리 코드를 작성할 필요 없이, 작업을 스레드 풀에 제출하는 것으로 충분합니다.
- 자원 관리
- 스레드 풀이 자동으로 시스템 자원을 관리하여, 과도한 스레드 생성으로 인한 스레드 스케줄링 비용과 메모리 오버헤드를 줄입니다.
ThreadPool 사용 예제
using System;
using System.Threading;
class Program
{
static void Main()
{
// ThreadPool에 작업 추가
ThreadPool.QueueUserWorkItem(state =>
{
Console.WriteLine($"작업 실행: {Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(1000); // 작업 수행
Console.WriteLine("작업 완료");
});
Console.WriteLine("메인 스레드 대기");
Thread.Sleep(2000); // 메인 스레드 대기
}
}
출력 예제
메인 스레드 대기
작업 실행: 5
작업 완료
ThreadPool의 주요 메서드
- QueueUserWorkItem
- 작업을 스레드 풀에 추가합니다.
- 예: ThreadPool.QueueUserWorkItem(MyTask);
- SetMinThreads / SetMaxThreads
- 최소 및 최대 스레드 수를 설정합니다.
- 예:
ThreadPool.SetMinThreads(4, 4); // 최소 스레드 수 설정 ThreadPool.SetMaxThreads(10, 10); // 최대 스레드 수 설정
- GetMinThreads / GetMaxThreads
- 현재 최소 및 최대 스레드 수를 가져옵니다.
- GetAvailableThreads
- 현재 사용 가능한 스레드 수를 반환합니다.
ThreadPool의 제한점
- 작업 제어가 제한적
- 작업 우선순위 변경, 특정 작업 취소 등의 세부 제어가 어렵습니다.
- 이런 경우 **Task Parallel Library(TPL)**를 사용하는 것이 더 적합합니다.
- 작업 시간이 긴 경우 비효율적
- 작업 시간이 너무 길면 해당 스레드가 장시간 점유되어, 다른 작업 처리에 지장이 생길 수 있습니다.
- 고정된 스레드 제한
- 최대 스레드 수에 제한이 있으며, 이를 초과할 경우 작업이 큐에 대기합니다.
ThreadPool과 Task의 관계
- C#의 Task는 내부적으로 ThreadPool을 사용하여 작업을 처리합니다.
- 그러나 Task는 비동기 프로그래밍을 위해 더 높은 수준의 API를 제공하며, 작업의 상태를 추적하거나 취소를 지원합니다.
결론
ThreadPool은 C#에서 효율적인 다중 작업 처리를 위해 제공되는 중요한 기능입니다. 간단한 비동기 작업 처리에는 ThreadPool이 유용하며, 복잡한 작업 스케줄링이 필요할 경우 Task와 함께 사용하는 것이 권장됩니다.
반응형
'C#' 카테고리의 다른 글
C#의 Garbage Collection (GC) 개념 (5) | 2025.01.03 |
---|---|
C#로 특정 폴더 내 파일 이름 변경 (1) | 2025.01.03 |
WNetUseConnection 함수의 리턴값과 오류 코드 목록 (1) | 2025.01.03 |
C#에서 WORD, DWORD와 비트 연산을 처리하는 방법 (0) | 2024.12.31 |
로컬 IP 127.0.0.1의 기본 포트 확인 및 설정 방법 (0) | 2024.12.30 |
C# Thread.Priority 속성 (1) | 2024.12.27 |
"C# 파일 복사 함수에서 불필요한 BinaryReader와 BinaryWriter 객체 사용에 대한 분석" (0) | 2024.12.26 |
다른 프로세스에서 파일을 사용 중인지 확인하는 함수. CheckFileLocked (7) | 2024.12.26 |