CThreadPool 클래스
이 클래스는 작업 항목의 큐를 처리하는 작업자 스레드 풀을 제공합니다.
구문
template <class Worker, class ThreadTraits = DefaultThreadTraits>
class CThreadPool : public IThreadPoolConfig
매개 변수
작업자
스레드 풀에서 큐에 대기 중인 작업 항목을 처리하는 데 사용되는 코드를 제공하는 작업자 아키타입 을 따르는 클래스입니다.
ThreadTraits
풀에서 스레드를 만드는 데 사용되는 함수를 제공하는 클래스입니다.
멤버
공용 생성자
속성 | 설명 |
---|---|
CThreadPool::CThreadPool | 스레드 풀의 생성자입니다. |
CThreadPool::~CThreadPool | 스레드 풀의 소멸자입니다. |
공용 메서드
이름 | 설명 |
---|---|
CThreadPool::AddRef | 의 구현입니다 IUnknown::AddRef . |
CThreadPool::GetNumThreads | 이 메서드를 호출하여 풀의 스레드 수를 가져옵니다. |
CThreadPool::GetQueueHandle | 작업 항목을 큐에 대기하는 데 사용되는 IO 완료 포트의 핸들을 가져오려면 이 메서드를 호출합니다. |
CThreadPool::GetSize | 이 메서드를 호출하여 풀의 스레드 수를 가져옵니다. |
CThreadPool::GetTimeout | 스레드 풀이 스레드가 종료될 때까지 대기하는 최대 시간(밀리초)을 얻으려면 이 메서드를 호출합니다. |
CThreadPool::Initialize | 스레드 풀을 초기화하려면 이 메서드를 호출합니다. |
CThreadPool::QueryInterface | 의 구현입니다 IUnknown::QueryInterface . |
CThreadPool::QueueRequest | 이 메서드를 호출하여 풀의 스레드에서 처리할 작업 항목을 큐에 대기합니다. |
CThreadPool::Release | 의 구현입니다 IUnknown::Release . |
CThreadPool::SetSize | 이 메서드를 호출하여 풀의 스레드 수를 설정합니다. |
CThreadPool::SetTimeout | 스레드 풀이 스레드가 종료될 때까지 대기하는 최대 시간(밀리초)을 설정하려면 이 메서드를 호출합니다. |
CThreadPool::Shutdown | 이 메서드를 호출하여 스레드 풀을 종료합니다. |
설명
풀의 스레드는 풀을 초기화, 크기 조정 또는 종료할 때 만들어지고 제거됩니다. 클래스 작업자 의 인스턴스는 풀에 있는 각 작업자 스레드의 스택에 만들어집니다. 각 인스턴스는 스레드의 수명 동안 라이브됩니다.
스레드를 만든 직후 작업자::Initialize
해당 스레드와 연결된 개체에 대해 호출됩니다. 스레드 가 소멸되기 직전에 Worker::Terminate
가 호출됩니다. 두 메서드 모두 인수를 void
* 수락해야 합니다. 이 인수의 값은 CThreadPool::Initialize의 pvWorkerParam 매개 변수를 통해 스레드 풀에 전달됩니다.
큐에 작업 항목과 작업에 사용할 수 있는 작업자 스레드가 있는 경우 작업자 스레드는 큐에서 항목을 끌어와 해당 스레드에 대한 Worker 개체의 메서드를 호출 Execute
합니다. 그런 다음, 큐의 항목, Worker:: 및 Worker:: Initialize
Terminate
에 전달되는 항목 pvWorkerParam
및 IO 완료 포트 큐에 사용되는 OVERLAPPED 구조에 대한 포인터의 세 가지 항목이 메서드에 전달됩니다.
Worker 클래스는 typedef, Worker:RequestType
: 를 제공하여 스레드 풀에서 큐에 대기할 항목의 형식을 선언합니다. 이 형식은 ULONG_PTR 캐스팅할 수 있어야 합니다.
작업자 클래스의 예는 CNonStatelessWorker 클래스입니다.
상속 계층 구조
IUnknown
CThreadPool
요구 사항
헤더: atlutil.h
CThreadPool::AddRef
의 구현입니다 IUnknown::AddRef
.
ULONG STDMETHODCALLTYPE AddRef() throw();
Return Value
항상 1을 반환합니다.
설명
이 클래스는 참조 계산을 사용하여 수명 컨트롤을 구현하지 않습니다.
CThreadPool::CThreadPool
스레드 풀의 생성자입니다.
CThreadPool() throw();
설명
ATLS_DEFAULT_THREADPOOLSHUTDOWNTIMEOUT 시간 제한 값을 초기화합니다. 기본 시간은 36초입니다. 필요한 경우 atlutil.h를 포함하기 전에 이 기호에 대한 고유한 양의 정수 값을 정의할 수 있습니다.
CThreadPool::~CThreadPool
스레드 풀의 소멸자입니다.
~CThreadPool() throw();
설명
CThreadPool::Shutdown을 호출 합니다.
CThreadPool::GetNumThreads
이 메서드를 호출하여 풀의 스레드 수를 가져옵니다.
int GetNumThreads() throw();
Return Value
풀의 스레드 수를 반환합니다.
CThreadPool::GetQueueHandle
작업 항목을 큐에 대기하는 데 사용되는 IO 완료 포트의 핸들을 가져오려면 이 메서드를 호출합니다.
HANDLE GetQueueHandle() throw();
Return Value
스레드 풀이 초기화되지 않은 경우 큐 핸들 또는 NULL을 반환합니다.
CThreadPool::GetSize
이 메서드를 호출하여 풀의 스레드 수를 가져옵니다.
HRESULT STDMETHODCALLTYPE GetSize(int* pnNumThreads) throw();
매개 변수
pnNumThreads
[out] 성공 시 풀의 스레드 수를 수신하는 변수의 주소입니다.
Return Value
성공 시 S_OK를 반환하거나 실패 시 HRESULT 오류를 반환합니다.
CThreadPool::GetTimeout
스레드 풀이 스레드가 종료될 때까지 대기하는 최대 시간(밀리초)을 얻으려면 이 메서드를 호출합니다.
HRESULT STDMETHODCALLTYPE GetTimeout(DWORD* pdwMaxWait) throw();
매개 변수
pdwMaxWait
[out] 성공 시 스레드 풀이 스레드가 종료될 때까지 대기하는 최대 시간(밀리초)을 수신하는 변수의 주소입니다.
Return Value
성공 시 S_OK를 반환하거나 실패 시 HRESULT 오류를 반환합니다.
설명
이 시간 제한 값은 다른 값이 해당 메서드에 제공되지 않는 경우 CThreadPool::Shutdown 에서 사용됩니다.
CThreadPool::Initialize
스레드 풀을 초기화하려면 이 메서드를 호출합니다.
HRESULT Initialize(
void* pvWorkerParam = NULL,
int nNumThreads = 0,
DWORD dwStackSize = 0,
HANDLE hCompletion = INVALID_HANDLE_VALUE) throw();
매개 변수
pvWorkerParam
작업자 스레드 개체 및 메서드에 전달할 작업자 매개 변수입니다Initialize
Execute
Terminate
.
nNumThreads
풀에서 요청된 스레드 수입니다.
nNumThreads가 음수이면 절대값에 컴퓨터의 프로세서 수를 곱하여 총 스레드 수를 가져옵니다.
nNumThreads가 0이면 ATLS_DEFAULT_THREADSPERPROC 컴퓨터의 프로세서 수를 곱하여 총 스레드 수를 가져옵니다. 기본값은 프로세서당 2개의 스레드입니다. 필요한 경우 atlutil.h를 포함하기 전에 이 기호에 대한 고유한 양의 정수 값을 정의할 수 있습니다.
dwStackSize
풀의 각 스레드에 대한 스택 크기입니다.
hCompletion
완료 포트와 연결할 개체의 핸들입니다.
Return Value
성공 시 S_OK를 반환하거나 실패 시 HRESULT 오류를 반환합니다.
CThreadPool::QueryInterface
의 구현입니다 IUnknown::QueryInterface
.
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv) throw();
설명
이 클래스의 개체는 IThreadPoolConfig 인터페이스에 IUnknown
대해 쿼리할 수 있습니다.
CThreadPool::QueueRequest
이 메서드를 호출하여 풀의 스레드에서 처리할 작업 항목을 큐에 대기합니다.
BOOL QueueRequest(Worker::RequestType request) throw();
매개 변수
request
큐에 대기할 요청입니다.
Return Value
성공하면 TRUE를 반환하고 실패하면 FALSE를 반환합니다.
설명
이 메서드는 큐에 작업 항목을 추가합니다. 풀의 스레드는 수신되는 순서대로 큐에서 항목을 선택합니다.
CThreadPool::Release
의 구현입니다 IUnknown::Release
.
ULONG STDMETHODCALLTYPE Release() throw();
Return Value
항상 1을 반환합니다.
설명
이 클래스는 참조 계산을 사용하여 수명 컨트롤을 구현하지 않습니다.
CThreadPool::SetSize
이 메서드를 호출하여 풀의 스레드 수를 설정합니다.
HRESULT STDMETHODCALLTYPE SetSizeint nNumThreads) throw();
매개 변수
nNumThreads
풀에서 요청된 스레드 수입니다.
nNumThreads가 음수이면 절대값에 컴퓨터의 프로세서 수를 곱하여 총 스레드 수를 가져옵니다.
nNumThreads가 0이면 ATLS_DEFAULT_THREADSPERPROC 컴퓨터의 프로세서 수를 곱하여 총 스레드 수를 가져옵니다. 기본값은 프로세서당 2개의 스레드입니다. 필요한 경우 atlutil.h를 포함하기 전에 이 기호에 대한 고유한 양의 정수 값을 정의할 수 있습니다.
Return Value
성공 시 S_OK를 반환하거나 실패 시 HRESULT 오류를 반환합니다.
설명
지정된 스레드 수가 현재 풀에 있는 스레드 수보다 작은 경우 개체는 대기 중인 스레드에 의해 선택될 큐에 종료 메시지를 배치합니다. 대기 중인 스레드가 큐에서 메시지를 끌어오면 스레드 풀에 알리고 스레드 프로시저를 종료합니다. 이 프로세스는 풀의 스레드 수가 지정된 수에 도달할 때까지 또는 GetTimeout SetTimeout에서 지정한 기간 내에 스레드가 종료되지 않을 때까지 반복됩니다./ 이 경우 메서드는 WAIT_TIMEOUT 해당하는 HRESULT를 반환하고 보류 중인 종료 메시지가 취소됩니다.
CThreadPool::SetTimeout
스레드 풀이 스레드가 종료될 때까지 대기하는 최대 시간(밀리초)을 설정하려면 이 메서드를 호출합니다.
HRESULT STDMETHODCALLTYPE SetTimeout(DWORD dwMaxWait) throw();
매개 변수
dwMaxWait
스레드 풀이 스레드가 종료될 때까지 대기하는 요청된 최대 시간(밀리초)입니다.
Return Value
성공 시 S_OK를 반환하거나 실패 시 HRESULT 오류를 반환합니다.
설명
시간 제한은 ATLS_DEFAULT_THREADPOOLSHUTDOWNTIMEOUT 초기화됩니다. 기본 시간은 36초입니다. 필요한 경우 atlutil.h를 포함하기 전에 이 기호에 대한 고유한 양의 정수 값을 정의할 수 있습니다.
dwMaxWait은 풀이 단일 스레드가 종료될 때까지 대기하는 시간입니다. 풀에서 여러 스레드를 제거하는 데 걸리는 최대 시간은 스레드 수를 곱한 dwMaxWait보다 약간 적을 수 있습니다.
CThreadPool::Shutdown
이 메서드를 호출하여 스레드 풀을 종료합니다.
void Shutdown(DWORD dwMaxWait = 0) throw();
매개 변수
dwMaxWait
스레드 풀이 스레드가 종료될 때까지 대기하는 요청된 최대 시간(밀리초)입니다. 값이 0이거나 없는 경우 이 메서드는 CThreadPool::SetTimeout에서 설정한 시간 제한을 사용합니다.
설명
이 메서드는 풀의 모든 스레드에 종료 요청을 게시합니다. 시간 제한이 만료되면 이 메서드는 종료되지 않은 스레드에서 TerminateThread를 호출합니다. 이 메서드는 클래스의 소멸자에서 자동으로 호출됩니다.