E D R S I H C RSS
ID
Password
Join
너는 항상 내 아내를 사랑해라. 그러면 네 아내가 내 아내에게 사랑받을 것이다. -- 아버지가 아들에게 보내는 26가지 삶의 지혜

(MSDN 직역)

쓰레드를 생성하는 대부분의 어플리케이션은 이벤트가 발생하기 만을 기다리는 잠자는(sleeping) 상태에서 많은 시간을 소비한다. 다른 쓰레드들은 변경 혹은 업데이트 상태 정보가 간헐적으로 던져지기 까지는 Sleeping 상태에 들어가 있을 것이다. 쓰레드 풀링은 시스템에 의해서 관리되는 일꾼 쓰레드들의 pool을 어플리케이션에 제공함으로써 쓰레드들을 더 효율적으로 사용하는 것을 가능하게 한다.

적어도 한 쓰레드가 쓰레드 풀에 적재되는(queued) 모든 Wait명령의 상태를 모니터한다. Wait 명령이 완결되었을때, 쓰레드 풀내의 일꾼 쓰레드는 상응되는 콜백함수를 실행한다. 또한 쓰래드 풀에게 Wait 명령과 상관없는 (나름대로의) 작업아이템을 적재(queue)할 수도 있다.

쓰레드 풀내 쓰레드에 의해 다루어질 작업아이템을 요청하기 위해서는 QueueUserWorkItem함수를 호출하면 된다. 이 함수는 쓰레드 풀로부터 선택된 쓰레드에 의해 호출될 함수로의 인자를 가지고 있다. 일단 적재(queue)된 후에는 작업아이템을 취소하하는 방법은 없다.

타이머-큐 타이머들과 등록된(Registered) Wait 명령들 또한 쓰래드 풀을 사용한다. 그들의 콜백함수들은 쓰레드 풀에 적재된다.


또한 비동기적인 입출력명령을 보내기 위해 BindIoCompletionCallback 함수를 사용할수 있다. 입출력이 완료되면 쓰레드 풀내의 일꾼쓰레드에 의해 콜백함수가 실행된다.

쓰레드 풀은 맨처음 QueueUserWorkItem or BindIoCompletionCallback을 호출할 때 생성된다. 또는 타이머-큐 타이머들과 등록된(Registered) Wait 명령이 콜백함수를 적재(queue)했을 때에도 생성된다. 쓰레드 풀내에 생성될 수 있는 쓰레드의 수는 단지 사용가능한 메모리에 의해서만 제한된다. 각 쓰레드는 기본 크기의 스택을 사용하고 기본(deafult) 우선권한상에서 실행된다.

쓰레드 풀내에서의 일꾼 쓰레드에는 입출력과 비입출력의 두가지 타입이 있다. .

입출력 일꾼 쓰레드는 경고가능한 Wait상태하에서 대기하는 쓰레드를 말한다. 입출력 일꾼쓰레드들에게 적재되는 작업아이템들은 비동기적 프로시져 호출(APC : asynchronous procedure calls)로써 간주된다. 만일 경고가능한(alertable) 상태내에서 대기하고 있는 쓰레드에서 실행되어야만 한다면 작업아이템을 입출력 일꾼 쓰레드에 적재해야만 한다.

비입출력 일꾼 쓰레드는 IOCP상에서 대기하는 쓰레드를 의미한다. 비입출력 쓰레드를 사용하는 것은 입출력 쓰레드를 사용하는 것보다 더 효율적이다. (가능한한 비입출력 일꾼 쓰레드를 사용하기 바란다)

입출력과 비입출력 일꾼쓰레드 양쪽다 대기중인 비동기 입출력 요청이 존재한다면 종료되지 않는다. 두 종류의 쓰레드들은 작업아이템에 의해 비동기 입출력 완료 요구들을 초기화하는데 사용될 수 있다. 어쨌거나, 만일 처리가 끝날때까지 처리시간이 오래 걸린다면, 비입출력 일꾼 쓰레드(경고가능한 대기상태에 있을경우)내에 비동기 입출력 완료 요청을 보내는 것을 피해라.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 12:42:54
Processing time 0.3534 sec