Synchronizační datové struktury

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]

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.