Megosztás:


Szinkronizálási adatstruktúrák

Az egyidejűségi futtatókörnyezet számos adatstruktúrát biztosít, amelyek lehetővé teszik a megosztott adatokhoz való hozzáférés szinkronizálását több szálból. Ezek az adatstruktúrák akkor hasznosak, ha olyan megosztott adatokkal rendelkezik, amelyeket ritkán módosít. A szinkronizálási objektum, mint például egy kritikus szakasz, más szálakat várakoztat, amíg a megosztott erőforrás elérhetővé válik. Ezért ha egy ilyen objektumot használ a gyakran használt adatokhoz való hozzáférés szinkronizálására, az alkalmazásban elveszítheti a méretezhetőséget. A párhuzamos minták kódtára (PPL) biztosítja az egyidejűséget::kombinálható osztály, amely lehetővé teszi egy erőforrás megosztását több szál vagy feladat között szinkronizálás nélkül. Az osztályról további információt a combinablePárhuzamos tárolók és objektumok című témakörben talál.

Szakaszok

Ez a témakör részletesen ismerteti az alábbi aszinkron üzenetblokktípusokat:

kritikus szekció

Az concurrency::critical_section osztály egy együttműködő kölcsönös kizárási objektumot képvisel, amely ahelyett, hogy más feladatokat megelőzne, engedi azok végrehajtását. A kritikus szakaszok akkor hasznosak, ha több szál kizárólagos olvasási és írási hozzáférést igényel a megosztott adatokhoz.

Az critical_section osztály nem újraküldéses. Az concurrency::critical_section::lock metódus concurrency::improper_lock típusú kivételt dob, ha a zárolást már birtokló szál hívja meg.

Metódusok és szolgáltatások

Az alábbi táblázat az osztály által definiált critical_section fontos metódusokat mutatja be.

Metódus Leírás
zár Lefoglalja a kritikus szakaszt. A hívó környezet blokkolódik, amíg meg nem szerzi a zárolást.
try_lock (próbál zárni) Megpróbálja beszerezni a kritikus szakaszt, de nem tiltja le.
kinyit Kioldja a kritikus szakaszt.

[Felső]

olvasó-író zár

A concurrency::reader_writer_lock osztály szálbiztos olvasási/írási műveleteket biztosít a megosztott adatok számára. Olvasó-/írózárolást akkor használjon, ha több szál egyidejű olvasási hozzáférést igényel egy megosztott erőforráshoz, de ritkán ír a megosztott erőforrásba. Ez az osztály egyszerre csak egy szál írási hozzáférést biztosít egy objektumhoz.

Az reader_writer_lock osztály jobban teljesíthet, mint az critical_section osztály, mivel egy critical_section objektum kizárólagos hozzáférést szerez egy megosztott erőforráshoz, ami megakadályozza az egyidejű olvasási hozzáférést.

Az osztályhoz critical_section hasonlóan az reader_writer_lock osztály is egy együttműködési kölcsönös kizárási objektumot jelöl, amely ahelyett, hogy preemptálást végez, más feladatokat eredményez.

Ha egy megosztott erőforrásba írandó szál olvasó-író zárolást szerez be, az erőforráshoz szintén hozzáférő egyéb szálak blokkolva lesznek, amíg az író fel nem oldja a zárolást. Az reader_writer_lock osztály példa az írási preferenciális zárolásra, amely egy zárolás, amely feloldja a várakozó írók blokkolását, mielőtt feloldja a várakozó olvasók blokkolását.

Az osztályhoz critical_section hasonlóan az reader_writer_lock osztály nem újraküldéses. Az concurrency::reader_writer_lock::lock és concurrency::reader_writer_lock::lock_read metódusok kivételt dobnak a improper_lock típusból, ha egy olyan szál hívja meg őket, amely már rendelkezik a zárolással.

Megjegyzés:

Mivel az reader_writer_lock osztály nem rekurzív, nem bővíthető írásvédett zárolás olvasó-író zárolásra, és nem minősíthető le olvasó-író zárolás írásvédett zárolásra. Ezen műveletek bármelyikének végrehajtása meghatározatlan viselkedést eredményez.

Metódusok és szolgáltatások

Az alábbi táblázat az osztály által definiált reader_writer_lock fontos metódusokat mutatja be.

Metódus Leírás
zár Olvasási/írási hozzáférést szerez a zárhoz.
try_lock (próbál zárni) Olvasási/írási hozzáférést próbál szerezni a zároláshoz, de nem korlátozza.
zár_olvasás Csak olvasható hozzáférést szerez a zároláshoz.
try_lock_read (olvasási zárolás megpróbálása) Megpróbál csak olvasási hozzáférést szerezni a zároláshoz, de nem akadályozza meg.
kinyit Feloldja a zárolást.

[Felső]

scoped_lock és scoped_lock_read

Az critical_section és reader_writer_lock az osztályok beágyazott segédosztályokat biztosítanak, amelyek leegyszerűsítik a kölcsönös kizárási objektumok működését. Ezeket a segédosztályokat hatókörzárolásoknak nevezzük.

Az critical_section osztály tartalmazza a konkurens::critical_section::scoped_lock osztályt. A konstruktor hozzáférést szerez a megadott critical_section objektumhoz; a destruktor hozzáférést ad az objektumhoz. Az reader_writer_lock osztály tartalmazza a concurrency::reader_writer_lock::scoped_lock osztályt, amely hasonlít a critical_section::scoped_lock-hoz, kivéve hogy kezeli a megadott reader_writer_lock objektum írási hozzáférését. Az reader_writer_lock osztály tartalmazza továbbá a concurrency::reader_writer_lock::scoped_lock_read osztályt. Ez az osztály kezeli a megadott reader_writer_lock objektum olvasási hozzáférését.

A hatókörrel rendelkező zárolások számos előnnyel járnak, amikor critical_section és reader_writer_lock objektumokkal dolgozik manuálisan. Általában egy hatókörhöz kötött zárolást helyez el a veremen. A hatókörrel rendelkező zárolás automatikusan felszabadítja a kölcsönös kizárási objektumhoz való hozzáférést, amikor megsemmisül; ezért nem szükséges kézzel feloldani a mögöttes objektum zárolását. Ez akkor hasznos, ha egy függvény több return utasítást tartalmaz. A hatókörön belüli zárolások segíthetnek a kivételmentes kód írásában is. Amikor egy throw utasítás a verem kikapcsolását okozza, a kód meghívja az aktív hatókörű zárolások destruktorát, ezért a kölcsönös kizárási objektum mindig helyesen szabadul fel.

Megjegyzés:

A critical_section::scoped_lock, reader_writer_lock::scoped_lock és reader_writer_lock::scoped_lock_read osztályok használatakor ne engedje fel manuálisan a hozzáférést a mögöttes kölcsönös kizárási objektumhoz. Ez érvénytelen állapotba helyezheti a futtatókörnyezetet.

esemény

Az egyidejűség::eseményosztály egy olyan szinkronizálási objektumot jelöl, amelynek állapota jelezhető vagy nem jelezhető. Ellentétben a szinkronizálási objektumokkal, például a kritikus szakaszokkal, amelyek célja a megosztott adatokhoz való hozzáférés védelme, az események szinkronizálják a végrehajtás folyamatát.

A event osztály akkor hasznos, ha az egyik feladat befejezett munkát végzett egy másik számára. Egy tevékenység például jelezheti egy másik tevékenységnek, hogy egy hálózati kapcsolatból vagy egy fájlból olvas be adatokat.

Metódusok és szolgáltatások

Az alábbi táblázat az osztály által definiált számos fontos metódust event mutatja be.

Metódus Leírás
várj Várakozás az esemény jelzésére.
beállítása Az eseményt a jelzett állapotra állítja.
visszaállítási Beállítja az eseményt a nem jelzett állapotra.
wait_for_multiple Több esemény jelzésére vár.

példa

Az osztály használatát event bemutató példa: Szinkronizálási adatstruktúrák összehasonlítása a Windows API-val.

[Felső]

Szinkronizálási adatstruktúrák összehasonlítása a Windows API-val
Összehasonlítja a szinkronizálási adatstruktúrák viselkedését a Windows API által biztosítottakkal.

Párhuzamossági futtatókörnyezet
Az egyidejűségi futtatókörnyezetet ismerteti, amely leegyszerűsíti a párhuzamos programozást, és kapcsolódó témakörökre mutató hivatkozásokat tartalmaz.