어제까지 멀티쓰레드 해봤고 오늘은 쓰레드 풀에 대해 썰을 풀어보자.
거두절미하고 다음과 같이 코드 함 해보자.
이걸 그냥 울트라 에디터에서 실행하면 중간에 끊긴다.
왜냐면 프로세스가 종료되어 버리기 때문에 자식으로 딸린 쓰레드도 죽어버린다.
따라서 Command창에서 실행해보자.
뭐 결과는 단일 쓰레드하고 똑.같.다. 그러나 내부 메커니즘은 분명히 다르다.
쓰레드를 사용할때 선언하고 할당하고 실행한다.
다시말해 일정 용량의 메모리를 사용하겠다고 선언하고 메모리에 할당하고 실행,종료하는 것이다. 이러한 작업을 10번이나 100번정도 계속 한다고 생각해보자. 정말 바보같은 짓아니겠는가?
그래서 POOL이라는 개념이 있다.
실재 일하는 쓰레드를 선언해놓고 POOL에 어떤 작업을 넣어두면 먼저 들어온넘부터 처리하고 다음것을 처리하는 등등의 일을 하고 마지막에 메모리에서 해제된다.
즉, 긴시간의 작업을 POOL을 통해 처리하면 바로 그 단점이 들어난다.
이 코드를 실행하면 10초 가량 걸릴것이다.
멀티 쓰레드라면 한 30개 쓰레드 띄워서 아무리 느린 PC라도 금방 끝낼일인데 말이다.
그러나 POOL은 자원확보차원에서 유리하다는 것만 알아두자.
거두절미하고 다음과 같이 코드 함 해보자.
using System;
using System.Threading;
class work{
public void runit(object obj){ //object obj는 반드시 넣어줘야 한다. 아니면 에러.
Console.WriteLine ("Thread {0}", obj);
}
}
class Test {
static void Main(){
Console.WriteLine("Thread Pool Start");
work wk = new work();
for (int i=0; i<1000; i++){
ThreadPool.QueueUserWorkItem(new WaitCallback(wk.runit),i); //쓰레드풀에 인자 넘기기
//ThreadPool.QueueUserWorkItem(new WaitCallback(wk.runit)); //쓰레드풀에 인자 안 넘기기
}
Console.WriteLine("Thread Pool End");
Console.Read(); //프로세스 종료를 막기위해 입력을 받는다.
}
}
이걸 그냥 울트라 에디터에서 실행하면 중간에 끊긴다.
왜냐면 프로세스가 종료되어 버리기 때문에 자식으로 딸린 쓰레드도 죽어버린다.
따라서 Command창에서 실행해보자.

쓰레드를 사용할때 선언하고 할당하고 실행한다.
다시말해 일정 용량의 메모리를 사용하겠다고 선언하고 메모리에 할당하고 실행,종료하는 것이다. 이러한 작업을 10번이나 100번정도 계속 한다고 생각해보자. 정말 바보같은 짓아니겠는가?
그래서 POOL이라는 개념이 있다.
실재 일하는 쓰레드를 선언해놓고 POOL에 어떤 작업을 넣어두면 먼저 들어온넘부터 처리하고 다음것을 처리하는 등등의 일을 하고 마지막에 메모리에서 해제된다.
즉, 긴시간의 작업을 POOL을 통해 처리하면 바로 그 단점이 들어난다.
using System;
using System.Threading;
class work{
public void runit(object obj){
Console.WriteLine ("Thread {0}", obj);
Thread.Sleep(5000);
}
}
class Test {
static void Main(){
Console.WriteLine("Thread Pool Start");
work wk = new work();
for (int i=0; i<30; i++){
ThreadPool.QueueUserWorkItem(new WaitCallback(wk.runit),i);
}
Console.WriteLine("Thread Pool End");
Console.Read();
}
}
이 코드를 실행하면 10초 가량 걸릴것이다.
멀티 쓰레드라면 한 30개 쓰레드 띄워서 아무리 느린 PC라도 금방 끝낼일인데 말이다.
그러나 POOL은 자원확보차원에서 유리하다는 것만 알아두자.





494377
21
173





