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.
Concurrency Runtime poskytuje několik datových struktur, které umožňují synchronizovat přístup ke sdíleným datům z více vláken. Tyto datové struktury jsou užitečné, když máte sdílená data, která upravujete zřídka. Synchronizační objekt, například kritický oddíl, způsobí, že ostatní vlákna počká, až bude sdílený prostředek k dispozici. Proto pokud takový objekt použijete k synchronizaci přístupu k datům, která se často používají, můžete ve své aplikaci ztratit škálovatelnost. Knihovna PPL (Parallel Patterns Library) poskytuje třídu concurrency::combinable , která umožňuje sdílet prostředek mezi několika vlákny nebo úlohami bez nutnosti synchronizace. Další informace o combinable třídě naleznete v tématu Paralelní kontejnery a objekty.
Oddíly
Toto téma podrobně popisuje následující typy bloků asynchronních zpráv:
kritická sekce
Třída concurrency::critical_section představuje objekt pro vzájemné vyloučení při spolupráci, který místo jejich přerušení předává řízení jiným úkolům. Kritické části jsou užitečné, když více vláken vyžaduje výhradní přístup pro čtení a zápis ke sdíleným datům.
Třída critical_section není reentrantní. Metoda concurrency::critical_section::lock vyvolá výjimku typu concurrency::improper_lock , pokud je volána vláknem, které již zámek vlastní.
Metody a funkce
Následující tabulka ukazuje důležité metody definované critical_section třídou.
| metoda | Popis |
|---|---|
| zamknout | Získá kritickou sekci. Kontext volání je blokován, dokud nezíská zámek. |
| try_lock | Pokusí se získat kritickou část, ale neblokuje. |
| odemknout | Uvolní kritickou část. |
[Nahoře]
zámek pro čtení a zápis
Třída concurrency::reader_writer_lock poskytuje bezpečný přístup z více vláken pro operace čtení a zápisu do sdílených dat. Použijte zámky pro čtení a zápis, pokud více vláken vyžaduje souběžný přístup ke čtení ke sdílenému prostředku, ale zřídka se do něj zapisuje. Tato třída umožňuje přístup k objektu pro zápis pouze jednomu vláknu v daném okamžiku.
Třída reader_writer_lock může provádět lépe než critical_section třída, protože critical_section objekt získává výhradní přístup ke sdílenému prostředku, což brání souběžnému přístupu ke čtení.
Stejně jako třída critical_section představuje třída reader_writer_lock kooperativní objekt vzájemného vyloučení, který povoluje jiným úkolům místo jejich přerušení.
Pokud vlákno, které musí zapisovat do sdíleného prostředku, získá zámek čtenáře/zapisovače, ostatní vlákna, která musí také přistupovat k prostředku, budou blokována, dokud zapisovač zámek neuvolní. Třída reader_writer_lock je příkladem zámku předvoleb zápisu, což je zámek, který odblokuje čekající zapisovače, než odblokuje čekající čtenáře.
Stejně jako třída critical_section není ani třída reader_writer_lock reentrantní. Souběžnost ::reader_writer_lock::lock a ::reader_writer_lock::lock_read metoda vyvolává výjimku typu improper_lock, pokud jsou volány vláknem, které již zámek vlastní.
Poznámka:
Vzhledem k tomu, že třída není reentrantní, nelze upgradovat zámek jen pro čtení na zámek pro čtení/zápis nebo downgradovat zámek pro čtení/zápis na zámek jen pro čtení. Provedení některých z těchto operací způsobuje nespecifikované chování.
Metody a funkce
Následující tabulka ukazuje důležité metody definované reader_writer_lock třídou.
| metoda | Popis |
|---|---|
| zamknout | Získá přístup pro čtení a zápis k zámku. |
| try_lock | Pokouší se získat přístup pro čtení a zápis k zámku, ale neblokuje. |
| zamknout_čtení | Získá přístup k zámku jen pro čtení. |
| try_lock_read | Pokouší se získat přístup jen pro čtení k zámku, ale neblokuje. |
| odemknout | Uvolní zámek. |
[Nahoře]
scoped_lock a scoped_lock_read
Třídy critical_section a reader_writer_lock poskytují vnořené pomocné třídy, které zjednodušují práci s objekty vzájemného vyloučení. Tyto pomocné třídy se označují jako zámky s vymezeným oborem.
Třída critical_section obsahuje třídu concurrency::critical_section::scoped_lock. Konstruktor získá přístup k poskytnutému critical_section objektu; destruktor uvolní přístup k ho objektu. Třída reader_writer_lock obsahuje třídu concurrency::reader_writer_lock::scoped_lock, která se podobá critical_section::scoped_lock, s tím rozdílem, že spravuje přístup k zápisu k objektu reader_writer_lock. Třída reader_writer_lock také obsahuje třídu concurrency::reader_writer_lock::scoped_lock_read. Tato třída spravuje přístup pro čtení k poskytnutému reader_writer_lock objektu.
Zámky s vymezeným rozsahem poskytují několik výhod při ruční práci s critical_section a reader_writer_lock objekty. Obvykle přidělíte vymezený zámek v zásobníku. Vymezený zámek uvolní přístup ke svému objektu vzájemného vyloučení automaticky, když je zničen; proto neodemykáte základní objekt ručně. To je užitečné, když funkce obsahuje více return příkazů. Uzamčení v rozsahu vám také mohou pomoci psát kód odolný vůči výjimkám.
throw Když příkaz způsobí rozvinutí zásobníku, je volán destruktor pro jakýkoli aktivní scopovaný zámek, takže objekt vzájemného vyloučení je vždy správně uvolněn.
Poznámka:
Při použití tříd critical_section::scoped_lock, reader_writer_lock::scoped_lock a reader_writer_lock::scoped_lock_read neuvolňujte ručně přístup k podkladovému objektu vzájemného vyloučení. To může modul runtime umístit do neplatného stavu.
událost
concurrency::event je třída představující synchronizační objekt, jehož stav může být signalizován nebo nesignalizován. Na rozdíl od synchronizačních objektů, jako jsou kritické oddíly, jejichž účelem je chránit přístup ke sdíleným datům, události synchronizují tok provádění.
Třída event je užitečná, když jeden úkol dokončí práci za jiný. Například jeden úkol může signalizovat jiný úkol, že má načtená data ze síťového připojení nebo ze souboru.
Metody a funkce
Následující tabulka ukazuje několik důležitých metod definovaných event třídou.
| metoda | Popis |
|---|---|
| Počkej | Čeká na signál označující událost. |
| nastavit | Nastaví událost do signalovaného stavu. |
| resetovat | Nastaví událost na nesignalizovaný stav. |
| wait_for_multiple | Čeká na signalizaci více událostí. |
Příklad
Příklad, který ukazuje, jak používat event třídu, viz Porovnání synchronizačních datových struktur s rozhraním API systému Windows.
[Nahoře]
Související oddíly
Porovnávání synchronizačních datových struktur s rozhraním API systému Windows
Porovná chování synchronizačních datových struktur s těmi, které poskytuje rozhraní API systému Windows.
Concurrency Runtime
Popisuje modul Concurrency Runtime, který zjednodušuje paralelní programování a obsahuje odkazy na související témata.