Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Fond vláken je kolekce pracovních vláken, která efektivně spouštějí asynchronní zpětné volání jménem aplikace. Fond vláken se primárně používá ke snížení počtu vláken aplikace a k zajištění správy pracovních vláken. Aplikace mohou zařazovat pracovní položky do fronty, přidružovat práci k objektům, na které lze čekat, automaticky ji zařazovat do fronty na základě časovače a svázat ji se vstupně-výstupními operacemi.
Architektura fondu vláken
Z využití fondu vláken můžou těžit následující aplikace:
- Aplikace, která je vysoce paralelní a může asynchronně odesílat velký počet malých pracovních položek (například distribuované vyhledávání indexů nebo vstupně-výstupní operace sítě).
- Aplikace, která vytváří a ukončuje velký počet vláken, z nichž každé běží jen krátce. Použití fondu vláken může snížit složitost správy vláken a režijní náklady spojené s vytvářením a zničením vláken.
- Aplikace, která na pozadí a souběžně zpracovává samostatné úlohy (například načítá více karet).
- Aplikace, která musí provádět výhradní čekání na objekty jádra nebo blokovat příchozí události v objektu. Použití fondu vláken může snížit složitost správy vláken a zvýšit výkon snížením počtu kontextových přepínačů.
- Aplikace, která vytváří vlastní vlákna určená k čekání na události.
Původní fond vláken byl ve Windows Vista zcela přepracován. Nový fond vláken je lepší, protože poskytuje jediný typ pracovních vláken (pro I/O i jiné než I/O operace), nepoužívá samostatné vlákno časovače, poskytuje jedinou frontu časovačů a vyhrazené trvale běžící vlákno. Poskytuje také skupiny pro čištění, vyšší výkon, více fondů pro každý proces, které jsou plánovány nezávisle, a nové API fondu vláken.
Architektura fondu vláken se skládá z následujících:
- Pracovní vlákna, která spouští funkce zpětného volání
- Vlákna číšníka, která čekají na více obslužných rutin čekání
- Pracovní fronta
- Výchozí fond vláken pro každý proces
- Pracovní továrna, která spravuje pracovní vlákna
Osvědčené postupy
Nové rozhraní API fondu vláken poskytuje větší flexibilitu a řízení než původní rozhraní API fondu vláken. Existuje však několik drobných, ale důležitých rozdílů. V původním rozhraní API bylo resetování čekání automatické; v novém rozhraní API musí být čekání pokaždé explicitně resetovat. Původní rozhraní API zpracovával zosobnění automaticky a přenesl kontext zabezpečení volajícího procesu do vlákna. S novým rozhraním API musí aplikace explicitně nastavit kontext zabezpečení.
Při používání fondu vláken se doporučují následující postupy:
Vlákna procesu sdílejí fond vláken. Jedno pracovní vlákno může současně spouštět více funkcí zpětného volání. Tato pracovní vlákna jsou spravována sdružením vláken. Proto neukončujte vlákno z fondu vláken voláním TerminateThread ve vlákně nebo voláním ExitThread z funkce zpětného volání.
Vstupně-výstupní požadavek může běžet na libovolném vlákně ve fondu vláken. Zrušení operace V/V ve vlákně z fondu vláken vyžaduje synchronizaci, protože funkce pro zrušení může běžet v jiném vlákně než to, které zpracovává požadavek V/V, což může vést ke zrušení neznámé operace. Chcete-li tomu zabránit, vždy při volání CancelIoEx pro asynchronní operace I/O zadejte strukturu OVERLAPPED, se kterou byl požadavek I/O zahájen, nebo použijte vlastní synchronizaci, abyste zajistili, že před voláním funkce CancelSynchronousIo nebo CancelIoEx nelze v cílovém vlákně spustit žádnou jinou operaci I/O.
Před vrácením z funkce vyčistěte všechny prostředky vytvořené ve funkci zpětného volání. Patří mezi ně TLS, kontexty zabezpečení, priority vláken a registrace COM. Funkce zpětného volání musí také obnovit stav vlákna před vrácením.
Udržujte čekací handly a jejich přidružené objekty naživu, dokud fond vláken neoznámí, že práci s daným handlem dokončil.
Označte všechna vlákna, která čekají na dlouhotrvající operace (například vyprázdnění vstupně-výstupních vyrovnávacích pamětí nebo uvolnění prostředků), aby fond vláken mohl místo čekání na ně přidělit nová vlákna.
Před uvolněním knihovny DLL, která používá fond vláken, zrušte všechny pracovní položky, vstupně-výstupní operace, operace čekání a časovače a počkejte na dokončení provádění zpětných volání.
Vyhněte se uváznutí odstraněním závislostí mezi pracovními položkami i mezi zpětnými voláními, tím, že zajistíte, aby zpětné volání nečekalo samo na sebe, a zachováním priority vlákna.
Nezařazujte příliš mnoho položek do fronty příliš rychle v procesu s dalšími komponentami používajícími výchozí fond vláken. Pro každý proces existuje jeden výchozí fond vláken, včetně Svchost.exe. Ve výchozím nastavení má každý fond vláken maximálně 500 pracovních vláken. Fond vláken se pokusí vytvořit více pracovních vláken, pokud počet pracovních vláken v připraveném nebo spuštěném stavu musí být menší než počet procesorů.
Vyhněte se modelu apartmánu s jedním vláknem MODELU COM, protože není kompatibilní s fondem vláken. Sta vytvoří stav vlákna, který může ovlivnit další pracovní položku vlákna. STA má obecně dlouhou životnost a je vázáno na konkrétní vlákno, což je opakem fondu vláken.
Vytvořte nový fond vláken, který bude řídit prioritu a izolaci vláken, vytvářet vlastní charakteristiky a případně zlepšit rychlost odezvy. Další skupiny vláken však vyžadují více systémových prostředků (vlákna, paměť jádra). Příliš mnoho fondů prostředků zvyšuje riziko soutěžení o prostředky CPU.
Pokud je to možné, použijte k signalizaci vlákna fondu vláken místo mechanismu založeného na APC objekt, na který lze čekat. APC nefungují s vlákny z fondu vláken tak dobře jako jiné signalizační mechanismy, protože systém řídí životnost vláken z fondu, takže je možné, že vlákno bude ukončeno dříve, než bude oznámení doručeno.
Použijte rozšíření ladicího programu fondu vláken !tp. Tento příkaz má následující využití:
- příznaky adresyfondu
- obj adresapříznaky
- tqueue adresypříznaky
- adresa číšníka
- adresa pracovního procesu
Pro pool, waiter a worker platí, že pokud je adresa nulová, příkaz vypíše všechny objekty. U waiteru a workeru vynechání adresy vypíše aktuální vlákno. Jsou definovány následující příznaky: 0x1 (jednořádkový výstup), 0x2 (vypsat členy) a 0x4 (vypsat pracovní frontu fondu).
Note
Moderní alternativy: U aplikací C++/WinRT je fond vláken Windows přístupný prostřednictvím koroutin – slouží co_await winrt::resume_background() k odesílání práce do fondu vláken a co_await winrt::resume_foreground(dispatcher) k návratu do vlákna uživatelského rozhraní. To poskytuje strukturovanou souběžnost bez ruční správy zpětného volání. Pro standardní kód v jazyce C++ nabízí std::async se zásadou std::launch::async přenositelný paralelismus založený na úlohách, ačkoli přímo nevyužívá fond vláken systému Windows.
Příbuzná témata