반응형

* MSDN 내용

방법: 스레드 풀 사용(C# 프로그래밍 가이드)

"스레드 풀"은 백그라운드에서 여러 가지 작업을 수행하는 데 사용할 수 있는 스레드의 컬렉션입니다. 백그라운드에 대한 자세한 내용은 스레딩 사용을 참조하십시오. 스레드 풀을 사용하면 기본 스레드에서 다른 작업을 비동기적으로 수행할 수 있습니다.

스레드 풀은 대개 서버 응용 프로그램에 사용됩니다. 들어오는 각 요청은 스레드 풀의 스레드에 할당되므로 기본 스레드를 사용할 수 있을 때까지 기다리거나 이후의 요청을 처리하는데 시간을 지연하지 않고 요청을 비동기적으로 처리할 수 있습니다.

풀에 있는 스레드가 해당 작업을 완료하고 대기 스레드의 큐로 반환되면 여기서 해당 스레드를 다시 사용할 수 있습니다. 이와 같이 스레드를 다시 사용하면 응용 프로그램에서 각 작업에 대해 새 스레드를 만드느라 리소스를 낭비하지 않아도 됩니다.

스레드 풀에는 일반적으로 스레드의 최대 수가 지정되어 있습니다. 모든 스레드에서 작업을 수행 중이면 다른 작업은 사용 가능한 스레드가 생길 때까지 큐에 배치됩니다.

고유한 스레드 풀을 구현할 수도 있지만 ThreadPool 클래스를 통해 .NET Framework에서 제공하는 스레드 풀을 사용하는 것이 더 간편합니다.

다음 예제에서는 .NET Framework 스레드 풀을 사용하여 20과 40 사이의 숫자 10개에 대한 Fibonacci 결과를 계산합니다. 각 Fibonacci 결과는 Fibonacci 클래스로 표현됩니다. 이 클래스는 계산을 수행하는 ThreadPoolCallback이라는 메서드를 제공합니다. 각 Fibonacci 값을 나타내는 개체가 작성되고 ThreadPoolCallback 메서드가 QueueUserWorkItem에 전달되면 이 메서드를 실행하기 위해 풀의 사용 가능한 스레드가 할당됩니다.

 Fibonacci 개체는 계산을 위해 어느 정도 임의로 지정되는 값이고 10개의 스레드는 각각 프로세서 시간을 할당받기 위해 경쟁하므로 10개의 결과를 모두 계산하는 데 얼마나 오래 걸릴지 미리 알 수 없습니다. 생성 과정에서 각 Fibonacci 개체가 ManualResetEvent 클래스의 인스턴스에 전달되는 이유는 바로 여기에 있습니다. 각 개체는 해당 계산이 완료되면 제공된 이벤트 개체에 신호를 보내므로 10개의 Fibonacci 개체가 모두 결과를 계산할 때까지 기본 스레드에서 WaitAll을 사용한 실행을 차단할 수 있습니다. 그런 다음 Main 메서드에서 각 Fibonacci 결과를 표시합니다.


샘플 출력

launching 10 tasks...

result calculated...

result calculated...

result calculated...

result calculated...

result calculated...

result calculated...

result calculated...

result calculated...

result calculated...

result calculated...

all calculations complete

Fibonacci(22) = 17711

Fibonacci(25) = 75025

Fibonacci(32) = 2178309

Fibonacci(36) = 14930352

Fibonacci(32) = 2178309

Fibonacci(26) = 121393

Fibonacci(35) = 9227465

Fibonacci(23) = 28657

Fibonacci(39) = 63245986

Fibonacci(22) = 17711

반응형

+ Recent posts