다음을 통해 공유


스레드 풀링

이벤트가 발생하기를 기다리는 절전 모드 상태에서 많은 시간을 보내는 스레드를 만드는 많은 애플리케이션이 있습니다. 다른 스레드는 변경 또는 업데이트 상태 정보를 폴링하기 위해 주기적으로 각성하기 위해서만 절전 모드로 전환될 수 있습니다. 스레드 풀링 통해 시스템에서 관리하는 작업자 스레드 풀을 애플리케이션에 제공하여 스레드를 보다 효율적으로 사용할 수 있습니다. 하나 이상의 스레드가 스레드 풀에 대기 중인 모든 대기 작업의 상태를 모니터링합니다. 대기 작업이 완료되면 스레드 풀의 작업자 스레드가 해당 콜백 함수를 실행합니다.

이 항목에서는 원래 스레드 풀 API에 대해 설명합니다. Windows Vista에 도입된 스레드 풀 API는 더 간단하고 안정적이며 성능이 향상되며 개발자에게 더 많은 유연성을 제공합니다. 현재 스레드 풀 API에 대한 자세한 내용은 스레드 풀참조하세요.

작업 항목이 대기 작업과 관련이 없는 경우에도 스레드 풀에 추가할 수 있습니다. 스레드 풀의 스레드에서 작업 항목을 처리하도록 요청하려면 QueueUserWorkItem 함수를 호출합니다. 이 함수는 스레드 풀에서 선택한 스레드에서 호출할 함수에 매개 변수를 사용합니다. 작업 항목이 큐에 대기된 후에는 취소할 수 없습니다.

타이머 큐 타이머와등록된 대기 작업들도 스레드 풀을 사용합니다. 해당 콜백 함수는 스레드 풀에 큐에 대기됩니다. BindIoCompletionCallback 함수를 사용하여 비동기 I/O 작업을 게시할 수도 있습니다. I/O가 완료되면 스레드 풀 스레드에서 콜백이 실행됩니다.

스레드 풀은 QueueUserWorkItem 또는 BindIoCompletionCallback을 처음 호출하거나, 타이머 큐 타이머 또는 등록된 대기 작업이 콜백 함수를 큐에 등록할 때 만들어집니다. 기본적으로 스레드 풀에서 만들 수 있는 스레드 수는 약 500개입니다. 각 스레드는 기본 스택 크기를 사용하고 기본 우선 순위에서 실행됩니다.

스레드 풀에는 I/O 및 비 I/O의 두 가지 유형의 작업자 스레드가 있습니다. I/O 작업자 스레드 경고 대기 상태에서 대기하는 스레드입니다. 작업 항목은 APC(비동기 프로시저 호출)로 I/O 작업자 스레드에 큐에 대기됩니다. 작업 항목이 경고 가능한 상태에서 대기하는 스레드에서 실행되어야 한다면, 해당 작업 항목을 I/O 작업자 스레드에 큐잉해야 합니다.

I/O가 아닌 작업자 스레드 는 I/O 완료 포트에서 기다립니다. I/O가 아닌 작업자 스레드를 사용하는 것이 I/O 작업자 스레드를 사용하는 것보다 더 효율적입니다. 따라서 가능하면 I/O가 아닌 작업자 스레드를 사용해야 합니다. 보류 중인 비동기 I/O 요청이 있는 경우 I/O 및 비 I/O 작업자 스레드가 모두 종료되지 않습니다. 비동기 I/O 완료 요청을 시작하는 작업 항목에서 두 유형의 스레드를 모두 사용할 수 있습니다. 그러나 완료하는 데 시간이 오래 걸릴 수 있는 경우 비동기 I/O 완료 요청을 I/O가 아닌 작업자 스레드에 게시하지 마십시오.

스레드 풀링을 사용하려면 작업 항목과 해당 항목이 호출하는 모든 함수가 스레드 풀로부터 안전해야 합니다. safe 함수는 실행 중인 스레드가 전용 또는 영구 스레드라고 가정하지 않습니다. 일반적으로 스레드 로컬 스토리지 사용하거나 RegNotifyChangeKeyValue 함수와 같은 영구 스레드가 필요한 비동기 호출을 수행하지 않아야 합니다. 그러나 이러한 함수는 전용 스레드(애플리케이션에서 생성됨)에서 호출하거나 영구 작업자 스레드에 큐에 대기할 수 있습니다(WT_EXECUTEINPERSISTENTTHREAD 옵션과 함께 QueueUserWorkItem 사용).

경고 가능한 I/O

비동기 프로시저 호출

I/O 처리 포트

스레드 풀