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_lock
a 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. |
resetovat | 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]
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.