Sdílet prostřednictvím


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:

critical_section

Concurrency::critical_section třída představuje objekt vzájemného vyloučení spolupráce, který se místo jejich předběžného vyřazení dává 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í znovu prováděná. 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
lock Získá kritickou část. Kontext volání blokuje, dokud zámek nezíská.
try_lock Pokusí se získat kritickou část, ale neblokuje.
Odemknout Uvolní kritickou část.

[Nahoře]

reader_writer_lock

Třída concurrency::reader_writer_lock poskytuje operace čtení a zápisu do sdílených dat bezpečných pro přístup z více vláken. Uzamčení čtečky a zapisovače použijte, když více vláken vyžaduje souběžný přístup ke čtení ke sdílenému prostředku, ale zřídka se do daného sdíleného prostředku zapisuje. Tato třída poskytuje přístup k objektu kdykoli jen pro zápis z více vláken.

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í.

critical_section Stejně jako třída reader_writer_lock představuje třída kooperativní vzájemné vyloučení objekt, který se dává jiným úkolům místo jejich vyřazení.

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 nezablokuje. 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.

critical_section Stejně jako třída reader_writer_lock není třída reentrantní. Souběžnost ::reader_writer_lock::lock a souběžnost::reader_writer_lock::lock_read metody vyvolá výjimku typu improper_lock , pokud jsou volány vláknem, které již zámek vlastní.

Poznámka

reader_writer_lock Vzhledem k tomu, že třída není znovu zařazená, nelze upgradovat zámek jen pro čtení na zámek čtečky/zapisovače nebo downgradovat zámek čtečky/zapisovače na zámek jen pro čtení. Provedení některé z těchto operací vytváří nezadané chování.

Metody a funkce

Následující tabulka ukazuje důležité metody definované reader_writer_lock třídou.

Metoda Popis
lock 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.
lock_read 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

reader_writer_lock Třídy critical_section poskytují vnořené pomocné třídy, které zjednodušují způsob práce 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 concurrency::critical_section::scoped_lock třída. Konstruktor získá přístup k poskytnutému critical_section objektu; destruktor uvolní přístup k ho objektu. Třída reader_writer_lock obsahuje concurrency::reader_writer_lock::scoped_lock třída, která se podobá critical_section::scoped_lock, s tím rozdílem, že spravuje přístup k zápisu k poskytnutému reader_writer_lock objektu. Třída reader_writer_lock také obsahuje concurrency::reader_writer_lock::scoped_lock_read třída. Tato třída spravuje přístup pro čtení k poskytnutému reader_writer_lock objektu.

Omezené zámky poskytují několik výhod při ruční práci s critical_section objekty 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é obory vám také můžou pomoct psát kód bezpečný pro výjimky. throw Když příkaz způsobí uvolnění zásobníku, je volána destruktor pro jakýkoli aktivní uzamčený obor, a proto je objekt vzájemného vyloučení vždy správně uvolněn.

Poznámka

Při použití critical_section::scoped_lock, reader_writer_lock::scoped_locka reader_writer_lock::scoped_lock_read třídy, neručně uvolnit přístup k podkladové vzájemné vyloučení objektu. To může modul runtime umístit do neplatného stavu.

event

Concurrency::event třída představuje synchronizační objekt, jehož stav může být signalován nebo signalizovat. 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čil práci pro jiný úkol. 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 to, až se událost signalizovala.
set Nastaví událost do signalovaného stavu.
Obnovit Nastaví událost na stav, který není signalizoval.
wait_for_multiple Čeká, až se signalizují 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.