Sdílet prostřednictvím


Synchronizační datové struktury

Souběžnost Runtime poskytuje několik datových struktur, které umožňují synchronizovat přístup ke sdíleným datům z více podprocesů.Tyto datové struktury jsou užitečné při sdílení dat, který upravit zřídka.Objekt synchronizace, například kritická sekce způsobuje další podprocesy čekat, až je dostupný sdílený prostředek.Proto pokud synchronizovat přístup k datům, která se často používá takový objekt, můžete ztratit škálovatelnosti aplikace.Knihovna PPL (Parallel Patterns Library) Poskytuje concurrency::combinable třídy, která umožňuje sdílení zdrojů mezi několika podprocesů nebo úkoly bez nutnosti synchronizace.Další informace o combinable třídy naleznete v tématu Paralelní kontejnery a objekty.

Oddíly

Toto téma popisuje následující typy bloku asynchronní zprávu podrobně:

  • critical_section

  • reader_writer_lock

  • scoped_lock a scoped_lock_read

  • Událost

critical_section

Concurrency::critical_section třída představuje vzájemné spolupráce vyloučení objekt, který dává jiným úlohám namísto jejich preempting.Kritické sekce jsou užitečné, pokud více podprocesů vyžaduje výhradní přístup pro zápis a ke sdíleným datům.

critical_section Je třída vícenásobně přístupné.Concurrency::critical_section::lock metoda výjimku typu concurrency::improper_lock Pokud je volána podprocesem vlastnící zámku.

Metody a funkce

Následující tabulka zobrazuje důležité metody, které jsou definovány critical_section třídy.

Metoda

Description

Zámek

Získá kritický oddíl.Volajícím bloky kontextu dokud získá zámek.

try_lock

Se pokusí získat důležité části, ale neblokuje.

Odemknout

Vydává kritický oddíl.

Top

reader_writer_lock

Concurrency::reader_writer_lock třída poskytuje operace zápisu podprocesu ke sdíleným datům.Čtecí a zapisovací zámky používáte více podprocesů vyžadují souběžný přístup pro čtení ke sdílenému prostředku, ale zřídka zapisovat do tohoto sdíleného prostředku.Tato třída poskytuje přístup pouze jednoho podprocesu zápisu objektu kdykoli.

reader_writer_lock Třídy lze provádět lepší než critical_section třídy, protože critical_section objektu získá výhradní přístup ke sdílenému prostředku, které zabraňuje souběžný přístup pro čtení.

Stejně jako critical_section třídy, reader_writer_lock třída představuje vzájemné spolupráce vyloučení objekt, který dává jiným úlohám namísto jejich preempting.

Kdy podproces, který musí zapsat do sdíleného prostředku získá zámek reader/writer, jiných podprocesů, které musí také přístup k prostředku jsou blokovány, dokud Zapisovatel odemkne.reader_writer_lock Příkladem je třída Zápis předvoleb zámku, který je který odblokuje autoři čekání před ho odblokuje čtenáři čekání na zámek.

Stejně jako critical_section třídy, reader_writer_lock je třída vícenásobně přístupné.Concurrency::reader_writer_lock::lock a concurrency::reader_writer_lock::lock_read vyvoláním metody výjimky typu improper_lock Pokud se nazývají vlastnícího uzamknutí podproces.

[!POZNÁMKA]

Protože reader_writer_lock třídy je vícenásobně přístupné, nelze inovovat na zámek reader/writer uzamčení jen pro čtení nebo omezit uzamčení reader/writer uzamčení jen pro čtení.Provádění těchto operací buď vytváří nespecifikované chování.

Metody a funkce

Následující tabulka zobrazuje důležité metody, které jsou definovány reader_writer_lock třídy.

Metoda

Description

Zámek

Získá přístup pro čtení i zápis k zámku.

try_lock

Se pokusí získat přístup pro čtení i zápis k zámku, ale neblokuje.

lock_read

Získá přístup jen pro čtení k zámku.

try_lock_read

Se pokusí získat přístup jen pro čtení k zámku, ale neblokuje.

Odemknout

Odemkne.

Top

scoped_lock a scoped_lock_read

critical_section a reader_writer_lock třídy poskytují vnořené pomocné třídy, které zjednodušuje způsob práce s objekty vzájemné vyloučení.Tyto pomocné třídy jsou známé jako rozsahem zámky.

critical_section Třída obsahuje concurrency::critical_section::scoped_lock třídy.Konstruktor získá přístup zadané critical_section objektu; vydává se objekt přístup k objektu.reader_writer_lock Třída obsahuje concurrency::reader_writer_lock::scoped_lock třídy, která se podobá critical_section::scoped_lock, s výjimkou, že spravuje přístup pro zápis stanoveno na reader_writer_lock objektu.reader_writer_lock Třída obsahuje také concurrency::reader_writer_lock::scoped_lock_read třídy.Tato třída spravuje přístup ke čtení stanoveno pro reader_writer_lock objektu.

Zámky Scoped poskytují několik výhod při práci s critical_section a reader_writer_lock objekty ručně.Obvykle přidělit scoped zámku v zásobníku.Zámek scoped přístup k objektu jeho vzájemné vyloučení automaticky po uvolní zničeno; proto můžete odemknout ručně základní objekt.To je užitečné při funkce obsahuje více return příkazy.Zámky Scoped také můžete zapsat kód výjimky bezpečné.Když throw zásobník unwind způsobuje prohlášení, se nazývá destruktoru pro všechny aktivní zámku oboru a proto vždy správně uvolnění objektu vzájemné vyloučení.

[!POZNÁMKA]

Při použití critical_section::scoped_lock, reader_writer_lock::scoped_lock, a reader_writer_lock::scoped_lock_read tříd, ručně uvolnit přístup k základní objekt vzájemné vyloučení.Tento modul runtime umístit v neplatném stavu.

Událost

Concurrency::event třída představuje objekt synchronizace stavem může být signalizováno následným tichem nebo bez signalizováno následným tichem.Synchronizace objektů, například kritické sekce, jejichž účelem je chránit přístup ke sdíleným datům, na rozdíl od událostí synchronizovat toku spouštění.

event Třídy je užitečné, když jeden úkol dokončil práce na jiném úkolu.Například jeden úkol může být signál jiného úkolu se má číst data z připojení k síti nebo ze souboru.

Metody a funkce

Následující tabulka uvádí několik důležitých metody, které jsou definovány event třídy.

Metoda

Description

čekání

Čeká na událost stane signalizováno následným tichem.

nastavit

Nastaví událost signalizovaném stavu.

obnovit

Nastaví stav bez signalizováno následným tichem události.

wait_for_multiple

Čeká více událostí, které se stanou signalizováno následným tichem.

Příklad

Příklad, který ukazuje, jak použít event třídy naleznete v tématu Porovnávání synchronizačních datových struktur s rozhraním API systému Windows.

Top

Související oddíly