Share via


스레드 풀링

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

이 항목에서는 원래 스레드 풀 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 작업자 스레드에 게시하지 마십시오.

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

경고 가능한 I/O

비동기 프로시저 호출

I/O 완료 포트

스레드 풀