Udostępnij za pośrednictwem


Struktury danych synchronizacji

Środowisko współbieżne udostępnia kilka struktur danych, które umożliwiają synchronizowanie dostępu do współdzielonych danych z wielu wątków. Te struktury danych są przydatne w przypadku rzadko modyfikowanych danych udostępnionych. Obiekt synchronizacji, na przykład sekcja krytyczna, powoduje, że inne wątki będą czekać, aż udostępniony zasób będzie dostępny. W związku z tym, jeśli używasz takiego obiektu do synchronizowania dostępu do często używanych danych, możesz utracić skalowalność w aplikacji. Biblioteka Parallel Patterns Library (PPL) udostępnia klasę concurrency::combinable, która umożliwia współdzielenie zasobów między kilkoma wątkami lub zadaniami bez potrzeby synchronizacji. Aby uzyskać więcej informacji na temat combinable klasy, zobacz Parallel Containers and Objects (Kontenery równoległe i obiekty).

Sekcje

W tym temacie opisano szczegółowo następujące asynchroniczne typy bloków komunikatów:

sekcja krytyczna

Klasa współbieżności::critical_section reprezentuje obiekt kooperacyjnego wzajemnego wykluczania, który ustępuje innym zadaniom zamiast je wyprzedzać. Sekcje krytyczne są przydatne, gdy wiele wątków wymaga wyłącznego dostępu do odczytu i zapisu do udostępnionych danych.

Klasa critical_section jest niewielokrotnego wejścia. Metoda concurrency::critical_section::lock zgłasza wyjątek typu concurrency::improper_lock , jeśli jest wywoływany przez wątek, który jest już właścicielem blokady.

Metody i funkcje

W poniższej tabeli przedstawiono ważne metody zdefiniowane przez klasę critical_section .

Metoda opis
blokada Przechodzi do sekcji krytycznej. Kontekst wywołujący blokuje się do momentu uzyskania zamka.
próbuj_zablokować Próbuje uzyskać sekcję krytyczną, ale nie blokuje.
Odblokować Zwalnia sekcję krytyczną.

[Top]

Klasa reader_writer_lock

Klasa concurrency::reader_writer_lock zapewnia bezpieczne wątkowo operacje odczytu/zapisu na udostępnionych danych. Użyj blokad czytelnika/pisarza, gdy wiele wątków wymaga współbieżnego dostępu do odczytu do zasobu współdzielonego, ale rzadko zapisuje do tego zasobu. Ta klasa umożliwia tylko jednemu wątkowi jednocześnie dostęp do zapisu do obiektu.

Klasa reader_writer_lock może działać lepiej niż critical_section klasa, ponieważ critical_section obiekt uzyskuje wyłączny dostęp do udostępnionego zasobu, co uniemożliwia współbieżny dostęp do odczytu.

Jak klasa critical_section, klasa reader_writer_lock reprezentuje kooperacyjny obiekt wzajemnego wykluczania, który ustępuje innym zadaniom zamiast ich wyprzedzać.

Gdy wątek, który musi zapisywać w zasobie współdzielonym, uzyskuje blokadę czytelnika/zapisu, inne wątki, które również muszą uzyskać dostęp do zasobu, są zablokowane, dopóki zapisujący nie zwolni blokady. Klasa reader_writer_lock jest przykładem blokady preferencji zapisu, która jest blokadą, która odblokuje oczekujących pisarzy przed odblokowaniem oczekujących czytelników.

Podobnie jak klasa critical_section, klasa reader_writer_lock jest niezreenrantowalna. Metody concurrency::reader_writer_lock::lock i concurrency::reader_writer_lock::lock_read zgłaszają wyjątek typu improper_lock , jeśli są wywoływane przez wątek, który jest już właścicielem blokady.

Uwaga

reader_writer_lock Ponieważ klasa nie jest reentrantna, nie można uaktualnić blokady tylko do odczytu do blokady do odczytu/zapisu ani obniżyć blokady do odczytu/zapisu do blokady tylko do odczytu. Wykonanie jednej z tych operacji powoduje nieokreślone zachowanie.

Metody i funkcje

W poniższej tabeli przedstawiono ważne metody zdefiniowane przez klasę reader_writer_lock .

Metoda opis
zamknięcie Uzyskuje dostęp do odczytu/zapisu do zamka.
próbuj_zablokować Próbuje uzyskać dostęp do odczytu/zapisu do blokady, ale nie blokuje.
blokada_odczytu Uzyskuje dostęp tylko do odczytu do blokady.
try_lock_read Próbuje uzyskać dostęp tylko do odczytu do zamka, bez jego blokowania.
Odblokować Zwalnia blokadę.

[Top]

scoped_lock i scoped_lock_read

Klasy critical_section i reader_writer_lock zapewniają zagnieżdżone klasy pomocnicze, które upraszczają pracę z obiektami służącymi do wzajemnego wykluczania. Te pomocnicze klasy są nazywane blokadami o zakresie ograniczonym.

Klasa critical_section zawiera klasę concurrency::critical_section::scoped_lock. Konstruktor uzyskuje dostęp do podanego critical_section obiektu; destruktor zwalnia dostęp do tego obiektu. Klasa reader_writer_lock zawiera klasę concurrency::reader_writer_lock::scoped_lock, która jest podobna do critical_section::scoped_lock, z tą różnicą, że zarządza dostępem do zapisu do dostarczonego obiektu reader_writer_lock. Klasa reader_writer_lock zawiera również klasę concurrency::reader_writer_lock::scoped_lock_read . Ta klasa zarządza dostępem do odczytu do podanego reader_writer_lock obiektu.

Blokady zakresowe zapewniają szereg korzyści podczas ręcznego operowania obiektami critical_section i reader_writer_lock. Zazwyczaj przydziela się blokadę o określonym zakresie na stosie. Blokada o określonym zakresie zwalnia dostęp do obiektu wzajemnego wykluczania automatycznie, gdy zostanie zniszczony; w związku z tym nie można ręcznie odblokować obiektu bazowego. Jest to przydatne, gdy funkcja zawiera wiele return instrukcji. Blokady typu scoped mogą również pomóc w pisaniu kodu odpornego na wyjątki. Gdy throw instrukcja powoduje odwijanie stosu, destruktor dla każdej aktywnej blokady o określonym zakresie jest wywoływany, a zatem obiekt wzajemnego wykluczania jest zawsze poprawnie zwalniany.

Uwaga

Podczas używania klas critical_section::scoped_lock, reader_writer_lock::scoped_lock i reader_writer_lock::scoped_lock_read nie należy ręcznie zwalniać dostępu do bazowego obiektu mutual exclusion. Może to umieścić środowisko uruchomieniowe w nieprawidłowym stanie.

wydarzenie

Klasa concurrency::event reprezentuje obiekt synchronizacji, którego stan można zasygnalizować lub niesygnalizować. W przeciwieństwie do obiektów synchronizacji, takich jak sekcje krytyczne, których celem jest ochrona dostępu do udostępnionych danych, zdarzenia synchronizują przepływ wykonywania.

Klasa event jest przydatna, gdy jedno zadanie zakończyło pracę dla innego zadania. Na przykład jedno zadanie może sygnalizować innemu zadaniu, że odczytało dane z połączenia sieciowego lub z pliku.

Metody i funkcje

W poniższej tabeli przedstawiono kilka ważnych metod zdefiniowanych przez klasę event .

Metoda opis
czekać Czeka, aż zdarzenie zostanie zasygnalizowane.
zestaw Ustawia zdarzenie na stan zasygnalizowany.
resetować Ustawia zdarzenie na stan niesygnalizowany.
wait_for_multiple Oczekuje, aż wiele zdarzeń zostanie zasygnalizowanych.

Przykład

Aby zapoznać się z przykładem użycia event klasy, zobacz Porównanie struktur danych synchronizacji z interfejsem API systemu Windows.

[Top]

Porównywanie struktur danych synchronizacji z Windows API
Porównuje zachowanie struktur danych synchronizacji z tymi udostępnianymi przez interfejs API systemu Windows.

Środowisko wykonawcze współbieżności
Opisuje środowisko uruchomieniowe współbieżności, które upraszcza programowanie równoległe i zawiera linki do powiązanych tematów.