Klasa CThreadPool
Ta klasa udostępnia pulę wątków roboczych, które przetwarzają kolejkę elementów roboczych.
Składnia
template <class Worker, class ThreadTraits = DefaultThreadTraits>
class CThreadPool : public IThreadPoolConfig
Parametry
Pracownik
Klasa zgodna z archetypem procesu roboczego dostarczającym kod używany do przetwarzania elementów roboczych znajdujących się w kolejce w puli wątków.
ThreadTraits
Klasa udostępniająca funkcję używaną do tworzenia wątków w puli.
Elementy członkowskie
Konstruktory publiczne
Nazwa/nazwisko | opis |
---|---|
CThreadPool::CThreadPool | Konstruktor puli wątków. |
CThreadPool::~CThreadPool | Destruktor puli wątków. |
Metody publiczne
Nazwa/nazwisko | opis |
---|---|
CThreadPool::AddRef | Implementacja .IUnknown::AddRef |
CThreadPool::GetNumThreads | Wywołaj tę metodę, aby uzyskać liczbę wątków w puli. |
CThreadPool::GetQueueHandle | Wywołaj tę metodę, aby uzyskać dojście do portu ukończenia operacji we/wy używanego do kolejkowania elementów roboczych. |
CThreadPool::GetSize | Wywołaj tę metodę, aby uzyskać liczbę wątków w puli. |
CThreadPool::GetTimeout | Wywołaj tę metodę, aby uzyskać maksymalny czas w milisekundach, który pula wątków będzie czekać na zamknięcie wątku. |
CThreadPool::Initialize | Wywołaj tę metodę, aby zainicjować pulę wątków. |
CThreadPool::QueryInterface | Implementacja .IUnknown::QueryInterface |
CThreadPool::QueueRequest | Wywołaj tę metodę, aby w kolejce element roboczy był obsługiwany przez wątek w puli. |
CThreadPool::Release | Implementacja .IUnknown::Release |
CThreadPool::SetSize | Wywołaj tę metodę, aby ustawić liczbę wątków w puli. |
CThreadPool::SetTimeout | Wywołaj tę metodę, aby ustawić maksymalny czas w milisekundach, który pula wątków będzie czekać na zamknięcie wątku. |
CThreadPool::Shutdown | Wywołaj tę metodę, aby zamknąć pulę wątków. |
Uwagi
Wątki w puli są tworzone i niszczone po zainicjowaniu, zmianie rozmiaru lub zamknięciu puli. Wystąpienie klasy Worker zostanie utworzone na stosie każdego wątku roboczego w puli. Każde wystąpienie będzie aktywne przez cały okres istnienia wątku.
Natychmiast po utworzeniu wątku proces roboczy:Initialize
zostanie wywołany w obiekcie skojarzonym z tym wątkiem. Bezpośrednio przed zniszczeniem wątku, Worker::Terminate
zostanie wywołany. Obie metody muszą zaakceptować void
* argument. Wartość tego argumentu jest przekazywana do puli wątków za pośrednictwem parametru pvWorkerParam CThreadPool::Initialize.
Gdy istnieją elementy robocze w kolejce i wątki procesu roboczego dostępne do pracy, wątek procesu roboczego ściągnie element z kolejki i wywoła Execute
metodę obiektu Worker dla tego wątku. Trzy elementy są następnie przekazywane do metody: element z kolejki, ten sam pvWorkerParam
przekazany do procesu roboczego:: i Worker:: Terminate
Initialize
oraz wskaźnik do struktury OVERLAPPED używanej dla kolejki portów uzupełniania operacji we/wy.
Klasa Proces roboczy deklaruje typ elementów, które zostaną w kolejce w puli wątków, podając definicję typów, Worker:: RequestType
. Ten typ musi być w stanie rzutować do i z ULONG_PTR.
Przykładem klasy Worker jest klasa CNonStatelessWorker.
Hierarchia dziedziczenia
IUnknown
CThreadPool
Wymagania
Nagłówek: atlutil.h
CThreadPool::AddRef
Implementacja .IUnknown::AddRef
ULONG STDMETHODCALLTYPE AddRef() throw();
Wartość zwracana
Zawsze zwraca wartość 1.
Uwagi
Ta klasa nie implementuje kontrolki okresu istnienia przy użyciu zliczania odwołań.
CThreadPool::CThreadPool
Konstruktor puli wątków.
CThreadPool() throw();
Uwagi
Inicjuje wartość limitu czasu na ATLS_DEFAULT_THREADPOOLSHUTDOWNTIMEOUT. Domyślny czas to 36 sekund. W razie potrzeby można zdefiniować własną dodatnią wartość całkowitą dla tego symbolu przed dołączeniem atlutil.h.
CThreadPool::~CThreadPool
Destruktor puli wątków.
~CThreadPool() throw();
Uwagi
Wywołuje klasę CThreadPool::Shutdown.
CThreadPool::GetNumThreads
Wywołaj tę metodę, aby uzyskać liczbę wątków w puli.
int GetNumThreads() throw();
Wartość zwracana
Zwraca liczbę wątków w puli.
CThreadPool::GetQueueHandle
Wywołaj tę metodę, aby uzyskać dojście do portu ukończenia operacji we/wy używanego do kolejkowania elementów roboczych.
HANDLE GetQueueHandle() throw();
Wartość zwracana
Zwraca uchwyt kolejki lub wartość NULL, jeśli pula wątków nie została zainicjowana.
CThreadPool::GetSize
Wywołaj tę metodę, aby uzyskać liczbę wątków w puli.
HRESULT STDMETHODCALLTYPE GetSize(int* pnNumThreads) throw();
Parametry
pnNumThreads
[out] Adres zmiennej, która w przypadku powodzenia otrzymuje liczbę wątków w puli.
Wartość zwracana
Zwraca S_OK powodzenia lub błąd HRESULT w przypadku niepowodzenia.
CThreadPool::GetTimeout
Wywołaj tę metodę, aby uzyskać maksymalny czas w milisekundach, który pula wątków będzie czekać na zamknięcie wątku.
HRESULT STDMETHODCALLTYPE GetTimeout(DWORD* pdwMaxWait) throw();
Parametry
pdwMaxWait
[out] Adres zmiennej, która po powodzeniu otrzymuje maksymalny czas w milisekundach, który pula wątków będzie czekać na zamknięcie wątku.
Wartość zwracana
Zwraca S_OK powodzenia lub błąd HRESULT w przypadku niepowodzenia.
Uwagi
Ta wartość limitu czasu jest używana przez klasę CThreadPool::Shutdown , jeśli żadna inna wartość nie jest dostarczana do tej metody.
CThreadPool::Initialize
Wywołaj tę metodę, aby zainicjować pulę wątków.
HRESULT Initialize(
void* pvWorkerParam = NULL,
int nNumThreads = 0,
DWORD dwStackSize = 0,
HANDLE hCompletion = INVALID_HANDLE_VALUE) throw();
Parametry
pvWorkerParam
Parametr procesu roboczego, który ma zostać przekazany do obiektów Initialize
wątku roboczego , Execute
i Terminate
metod.
nNumThreads
Żądana liczba wątków w puli.
Jeśli nNumThreads jest ujemna , jego wartość bezwzględna zostanie pomnożona przez liczbę procesorów na maszynie w celu uzyskania całkowitej liczby wątków.
Jeśli nNumThreads ma wartość zero, ATLS_DEFAULT_THREADSPERPROC zostanie pomnożona przez liczbę procesorów na maszynie w celu uzyskania całkowitej liczby wątków. Wartość domyślna to 2 wątki na procesor. W razie potrzeby można zdefiniować własną dodatnią wartość całkowitą dla tego symbolu przed dołączeniem atlutil.h.
dwStackSize
Rozmiar stosu dla każdego wątku w puli.
hCompletion
Uchwyt obiektu do skojarzenia z portem ukończenia.
Wartość zwracana
Zwraca S_OK powodzenia lub błąd HRESULT w przypadku niepowodzenia.
CThreadPool::QueryInterface
Implementacja .IUnknown::QueryInterface
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv) throw();
Uwagi
Obiekty tej klasy można pomyślnie odpytować dla IUnknown
interfejsów IThreadPoolConfig.
CThreadPool::QueueRequest
Wywołaj tę metodę, aby w kolejce element roboczy był obsługiwany przez wątek w puli.
BOOL QueueRequest(Worker::RequestType request) throw();
Parametry
prosić
Żądanie do kolejkowania.
Wartość zwracana
Zwraca wartość TRUE w przypadku powodzenia, FALSE w przypadku niepowodzenia.
Uwagi
Ta metoda dodaje element roboczy do kolejki. Wątki w puli pobierają elementy z kolejki w kolejności, w jakiej są odbierane.
CThreadPool::Release
Implementacja .IUnknown::Release
ULONG STDMETHODCALLTYPE Release() throw();
Wartość zwracana
Zawsze zwraca wartość 1.
Uwagi
Ta klasa nie implementuje kontrolki okresu istnienia przy użyciu zliczania odwołań.
CThreadPool::SetSize
Wywołaj tę metodę, aby ustawić liczbę wątków w puli.
HRESULT STDMETHODCALLTYPE SetSizeint nNumThreads) throw();
Parametry
nNumThreads
Żądana liczba wątków w puli.
Jeśli nNumThreads jest ujemna , jego wartość bezwzględna zostanie pomnożona przez liczbę procesorów na maszynie w celu uzyskania całkowitej liczby wątków.
Jeśli nNumThreads ma wartość zero, ATLS_DEFAULT_THREADSPERPROC zostanie pomnożona przez liczbę procesorów na maszynie w celu uzyskania całkowitej liczby wątków. Wartość domyślna to 2 wątki na procesor. W razie potrzeby można zdefiniować własną dodatnią wartość całkowitą dla tego symbolu przed dołączeniem atlutil.h.
Wartość zwracana
Zwraca S_OK powodzenia lub błąd HRESULT w przypadku niepowodzenia.
Uwagi
Jeśli określona liczba wątków jest mniejsza niż liczba wątków znajdujących się obecnie w puli, obiekt umieszcza komunikat zamknięcia w kolejce, który ma zostać odebrany przez wątek oczekiwania. Gdy wątek oczekujący ściąga komunikat z kolejki, powiadamia pulę wątków i zamyka procedurę wątku. Ten proces jest powtarzany do momentu osiągnięcia określonej liczby wątków w puli lub do momentu zakończenia wątku w przedziale określonym przez parametr GetTimeout SetTimeout/ . W takiej sytuacji metoda zwróci wartość HRESULT odpowiadającą WAIT_TIMEOUT, a oczekujący komunikat zamknięcia zostanie anulowany.
CThreadPool::SetTimeout
Wywołaj tę metodę, aby ustawić maksymalny czas w milisekundach, który pula wątków będzie czekać na zamknięcie wątku.
HRESULT STDMETHODCALLTYPE SetTimeout(DWORD dwMaxWait) throw();
Parametry
dwMaxWait
Żądany maksymalny czas w milisekundach, który pula wątków będzie czekać na zamknięcie wątku.
Wartość zwracana
Zwraca S_OK powodzenia lub błąd HRESULT w przypadku niepowodzenia.
Uwagi
Limit czasu jest inicjowany do ATLS_DEFAULT_THREADPOOLSHUTDOWNTIMEOUT. Domyślny czas to 36 sekund. W razie potrzeby można zdefiniować własną dodatnią wartość całkowitą dla tego symbolu przed dołączeniem atlutil.h.
Należy pamiętać, że dwMaxWait to czas oczekiwania puli na zamknięcie pojedynczego wątku. Maksymalny czas potrzebny do usunięcia wielu wątków z puli może być nieco krótszy niż dwMaxWait pomnożony przez liczbę wątków.
CThreadPool::Shutdown
Wywołaj tę metodę, aby zamknąć pulę wątków.
void Shutdown(DWORD dwMaxWait = 0) throw();
Parametry
dwMaxWait
Żądany maksymalny czas w milisekundach, który pula wątków będzie czekać na zamknięcie wątku. Jeśli zostanie podana wartość 0 lub żadna, ta metoda użyje limitu czasu ustawionego przez klasę CThreadPool::SetTimeout.
Uwagi
Ta metoda publikuje żądanie zamknięcia do wszystkich wątków w puli. Jeśli limit czasu wygaśnie, ta metoda wywoła metodę TerminateThread w każdym wątku, który nie zakończył działania. Ta metoda jest wywoływana automatycznie z destruktora klasy.