CThreadPool – třída
Tato třída poskytuje fond pracovních vláken, které zpracovávají frontu pracovních položek.
Syntaxe
template <class Worker, class ThreadTraits = DefaultThreadTraits>
class CThreadPool : public IThreadPoolConfig
Parametry
Pracovní podproces
Třída odpovídá archetypu pracovního procesu, který poskytuje kód použitý ke zpracování pracovních položek zařazených do fronty ve fondu vláken.
ThreadTraits
Třída poskytující funkci použitou k vytvoření vláken ve fondu.
Členové
Veřejné konstruktory
Název | Popis |
---|---|
CThreadPool::CThreadPool | Konstruktor fondu vláken. |
CThreadPool::~CThreadPool | Destruktor fondu vláken. |
Veřejné metody
Název | Popis |
---|---|
CThreadPool::AddRef | Provádění .IUnknown::AddRef |
CThreadPool::GetNumThreads | Voláním této metody získáte počet vláken ve fondu. |
CThreadPool::GetQueueHandle | Voláním této metody získáte popisovač portu dokončení vstupně-výstupních operací, který se používá k frontě pracovních položek. |
CThreadPool::GetSize | Voláním této metody získáte počet vláken ve fondu. |
CThreadPool::GetTimeout | Voláním této metody získáte maximální dobu v milisekundách, kterou fond vláken počká, až se vlákno vypne. |
CThreadPool::Initialize | Voláním této metody inicializujete fond vláken. |
CThreadPool::QueryInterface | Provádění .IUnknown::QueryInterface |
CThreadPool::QueueRequest | Voláním této metody zařadíte pracovní položku do fronty, kterou bude zpracovávat vlákno ve fondu. |
CThreadPool::Release | Provádění .IUnknown::Release |
CThreadPool::SetSize | Voláním této metody nastavíte počet vláken ve fondu. |
CThreadPool::SetTimeout | Voláním této metody nastavíte maximální dobu v milisekundách, po kterou bude fond vláken čekat, až se vlákno vypne. |
CThreadPool::Shutdown | Voláním této metody ukončete fond vláken. |
Poznámky
Vlákna ve fondu se vytvoří a zničí při inicializaci, změně velikosti nebo vypnutí fondu. Instance třídy Worker bude vytvořena v zásobníku každého pracovního vlákna ve fondu. Každá instance bude žít po celou dobu života vlákna.
Okamžitě po vytvoření vlákna bude pracovní proces::Initialize
volán u objektu přidruženého k danému vláknu. Bezprostředně před zničením vlákna bude volán pracovní proces::Terminate
Obě metody musí přijmout void
* argument. Hodnota tohoto argumentu se předává fondu vláken prostřednictvím parametru pvWorkerParam CThreadPool::Initialize.
Pokud jsou pracovní položky ve frontě a pracovních vláknech k dispozici pro práci, pracovní vlákno stáhne položku z fronty a zavolá Execute
metodu pracovního objektu pro dané vlákno. Metodě se pak předají tři položky: položka z fronty, stejná předaná Worker:: Initialize
and Worker:: Terminate
a ukazatel na strukturu OVERLAPPED použitou pro frontu portů dokončení vstupně-výstupních pvWorkerParam
operací.
Třída Worker deklaruje typ položek, které budou zařazeny do fronty ve fondu vláken poskytnutím typedef, Worker:: RequestType
. Tento typ musí být schopný přetypovat do a z ULONG_PTR.
Příkladem třídy Worker je CNonStatelessWorker Třída.
Hierarchie dědičnosti
IUnknown
CThreadPool
Požadavky
Hlavička: atlutil.h
CThreadPool::AddRef
Provádění .IUnknown::AddRef
ULONG STDMETHODCALLTYPE AddRef() throw();
Návratová hodnota
Vždy vrátí hodnotu 1.
Poznámky
Tato třída neimplementuje řízení životnosti pomocí počítání odkazů.
CThreadPool::CThreadPool
Konstruktor fondu vláken.
CThreadPool() throw();
Poznámky
Inicializuje hodnotu časového limitu na ATLS_DEFAULT_THREADPOOLSHUTDOWNTIMEOUT. Výchozí čas je 36 sekund. V případě potřeby můžete před zahrnutím hodnoty atlutil.h definovat pro tento symbol vlastní kladnou celočíselnou hodnotu.
CThreadPool::~CThreadPool
Destruktor fondu vláken.
~CThreadPool() throw();
Poznámky
Volá CThreadPool::Shutdown.
CThreadPool::GetNumThreads
Voláním této metody získáte počet vláken ve fondu.
int GetNumThreads() throw();
Návratová hodnota
Vrátí počet vláken ve fondu.
CThreadPool::GetQueueHandle
Voláním této metody získáte popisovač portu dokončení vstupně-výstupních operací, který se používá k frontě pracovních položek.
HANDLE GetQueueHandle() throw();
Návratová hodnota
Vrátí popisovač fronty nebo hodnotu NULL, pokud fond vláken nebyl inicializován.
CThreadPool::GetSize
Voláním této metody získáte počet vláken ve fondu.
HRESULT STDMETHODCALLTYPE GetSize(int* pnNumThreads) throw();
Parametry
pnNumThreads
[ven] Adresa proměnné, která při úspěchu obdrží počet vláken ve fondu.
Návratová hodnota
Vrátí S_OK při úspěchu nebo chybu HRESULT při selhání.
CThreadPool::GetTimeout
Voláním této metody získáte maximální dobu v milisekundách, kterou fond vláken počká, až se vlákno vypne.
HRESULT STDMETHODCALLTYPE GetTimeout(DWORD* pdwMaxWait) throw();
Parametry
pdwMaxWait
[ven] Adresa proměnné, která při úspěchu obdrží maximální dobu v milisekundách, po kterou fond vláken počká, než se vlákno vypne.
Návratová hodnota
Vrátí S_OK při úspěchu nebo chybu HRESULT při selhání.
Poznámky
Tuto hodnotu časového limitu používá CThreadPool::Shutdown , pokud do této metody není zadána žádná jiná hodnota.
CThreadPool::Initialize
Voláním této metody inicializujete fond vláken.
HRESULT Initialize(
void* pvWorkerParam = NULL,
int nNumThreads = 0,
DWORD dwStackSize = 0,
HANDLE hCompletion = INVALID_HANDLE_VALUE) throw();
Parametry
pvWorkerParam
Parametr pracovního procesu, který má být předán objektu Initialize
pracovního vlákna , Execute
a Terminate
metody.
nNumThreads
Požadovaný počet vláken ve fondu.
Pokud je argument nNumThreads záporný, jeho absolutní hodnota se vynásobí počtem procesorů v počítači, aby se získal celkový počet vláken.
Pokud je nNumThreads nula, ATLS_DEFAULT_THREADSPERPROC se vynásobí počtem procesorů v počítači, aby se získal celkový počet vláken. Výchozí hodnota je 2 vlákna na procesor. V případě potřeby můžete před zahrnutím hodnoty atlutil.h definovat pro tento symbol vlastní kladnou celočíselnou hodnotu.
dwStackSize
Velikost zásobníku pro každé vlákno ve fondu.
hCompletion
Popisovač objektu, který se má přidružit k portu dokončení.
Návratová hodnota
Vrátí S_OK při úspěchu nebo chybu HRESULT při selhání.
CThreadPool::QueryInterface
Provádění .IUnknown::QueryInterface
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv) throw();
Poznámky
Objekty této třídy lze úspěšně dotazovat na IUnknown
rozhraní a IThreadPoolConfig .
CThreadPool::QueueRequest
Voláním této metody zařadíte pracovní položku do fronty, kterou bude zpracovávat vlákno ve fondu.
BOOL QueueRequest(Worker::RequestType request) throw();
Parametry
prosba
Požadavek, který se má zařadit do fronty
Návratová hodnota
Vrátí hodnotu PRAVDA při úspěchu, NEPRAVDA při selhání.
Poznámky
Tato metoda přidá pracovní položku do fronty. Vlákna ve fondu vyberou položky z fronty v pořadí, ve kterém jsou přijaty.
CThreadPool::Release
Provádění .IUnknown::Release
ULONG STDMETHODCALLTYPE Release() throw();
Návratová hodnota
Vždy vrátí hodnotu 1.
Poznámky
Tato třída neimplementuje řízení životnosti pomocí počítání odkazů.
CThreadPool::SetSize
Voláním této metody nastavíte počet vláken ve fondu.
HRESULT STDMETHODCALLTYPE SetSizeint nNumThreads) throw();
Parametry
nNumThreads
Požadovaný počet vláken ve fondu.
Pokud je argument nNumThreads záporný, jeho absolutní hodnota se vynásobí počtem procesorů v počítači, aby se získal celkový počet vláken.
Pokud je nNumThreads nula, ATLS_DEFAULT_THREADSPERPROC se vynásobí počtem procesorů v počítači, aby se získal celkový počet vláken. Výchozí hodnota je 2 vlákna na procesor. V případě potřeby můžete před zahrnutím hodnoty atlutil.h definovat pro tento symbol vlastní kladnou celočíselnou hodnotu.
Návratová hodnota
Vrátí S_OK při úspěchu nebo chybu HRESULT při selhání.
Poznámky
Pokud je zadaný počet vláken menší než počet vláken aktuálně ve fondu, objekt umístí zprávu o vypnutí do fronty, která se má vyzvednout čekacím vláknem. Když čekající vlákno přetáhne zprávu z fronty, upozorní fond vláken a ukončí proceduru vlákna. Tento proces se opakuje, dokud počet vláken ve fondu nedosáhne zadaného čísla nebo dokud žádné vlákno neukončí v období určeném funkcí GetTimeout SetTimeout/ . V takovém případě metoda vrátí HRESULT odpovídající WAIT_TIMEOUT a čekající vypnutí zprávy je zrušena.
CThreadPool::SetTimeout
Voláním této metody nastavíte maximální dobu v milisekundách, po kterou bude fond vláken čekat, až se vlákno vypne.
HRESULT STDMETHODCALLTYPE SetTimeout(DWORD dwMaxWait) throw();
Parametry
dwMaxWait
Požadovaná maximální doba v milisekundách, po kterou fond vláken počká, až se vlákno vypne.
Návratová hodnota
Vrátí S_OK při úspěchu nebo chybu HRESULT při selhání.
Poznámky
Časový limit se inicializuje na ATLS_DEFAULT_THREADPOOLSHUTDOWNTIMEOUT. Výchozí čas je 36 sekund. V případě potřeby můžete před zahrnutím hodnoty atlutil.h definovat pro tento symbol vlastní kladnou celočíselnou hodnotu.
Všimněte si, že dwMaxWait je čas, kdy fond bude čekat na vypnutí jednoho vlákna. Maximální doba potřebná k odebrání více vláken z fondu může být o něco menší než dwMaxWait vynásobená počtem vláken.
CThreadPool::Shutdown
Voláním této metody ukončete fond vláken.
void Shutdown(DWORD dwMaxWait = 0) throw();
Parametry
dwMaxWait
Požadovaná maximální doba v milisekundách, po kterou fond vláken počká, až se vlákno vypne. Pokud je zadána hodnota 0 nebo žádná hodnota, tato metoda použije časový limit nastavený CThreadPool ::SetTimeout.
Poznámky
Tato metoda publikuje požadavek na vypnutí do všech vláken ve fondu. Pokud vypršení časového limitu vyprší, tato metoda zavolá TerminateThread na jakémkoli vlákně, které nebylo ukončeno. Tato metoda se volá automaticky z destruktoru třídy.