Udostępnij za pośrednictwem


Struktury danych synchronizacji

Środowisko uruchomieniowe współbieżności udostępnia kilka struktur danych, które umożliwiają synchronizowanie dostępu do udostępnionych 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 wzorców równoległych (PPL) udostępnia współbieżność::combinable , która umożliwia udostępnianie zasobu między kilkoma wątkami lub zadaniami bez konieczności 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:

critical_section

Klasa współbieżności::critical_section reprezentuje obiekt wzajemnego wykluczania współpracy, który daje inne zadania zamiast ich 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 nieautomacyjną. 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
lock Uzyskuje sekcję krytyczną. Kontekst wywołujący blokuje się do momentu uzyskania blokady.
try_lock 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 czytnika/modułu zapisywania, gdy wiele wątków wymaga współbieżnego dostępu do odczytu do udostępnionego zasobu, ale rzadko zapisuje w tym udostępnionym zasobie. Ta klasa zapewnia tylko jeden wątek dostępu do zapisu do obiektu w dowolnym momencie.

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.

critical_section Podobnie jak klasa, klasa reprezentuje kooperacyjny obiekt wzajemnego wykluczania, reader_writer_lock który daje inne zadania zamiast ich wyprzedzać.

Gdy wątek, który musi zapisywać w zasobie udostępnionym, uzyskuje blokadę czytnika/modułu zapisywania, inne wątki, które również muszą uzyskiwać dostęp do zasobu, zostaną zablokowane do momentu wydania blokady przez składnik zapisywania. 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.

critical_section Podobnie jak klasa, reader_writer_lock klasa jest nieententrant. 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 uwierzytelnianiem, nie można uaktualnić blokady tylko do odczytu do blokady czytnika/modułu zapisywania lub obniżenia poziomu blokady czytnika/modułu zapisywania 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
lock Uzyskuje dostęp do odczytu/zapisu do blokady.
try_lock Próbuje uzyskać dostęp do odczytu/zapisu do blokady, ale nie blokuje.
lock_read Uzyskuje dostęp tylko do odczytu do blokady.
try_lock_read Próbuje uzyskać dostęp tylko do odczytu do blokady, ale nie blokuje.
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 wzajemnego wykluczania. Te klasy pomocnicze są nazywane blokadami o określonym zakresie.

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 podobną do klasy , z tą różnicą, critical_section::scoped_lockże zarządza dostępem do zapisu do dostarczonego reader_writer_lock obiektu. 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 o określonym zakresie zapewniają kilka korzyści podczas pracy z obiektami critical_section i reader_writer_lock ręcznie. 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 o określonym zakresie mogą również pomóc w pisaniu kodu bezpiecznego dla wyjątków. 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

W przypadku używania critical_section::scoped_lockklas , reader_writer_lock::scoped_locki reader_writer_lock::scoped_lock_read nie należy ręcznie zwalniać dostępu do bazowego obiektu wzajemnego wykluczania. Może to umieścić środowisko uruchomieniowe w nieprawidłowym stanie.

event

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 jest przydatna event , gdy jedno zadanie zakończyło pracę dla innego zadania. Na przykład jedno zadanie może sygnalizać inne zadanie, które ma odczyt danych 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.
set Ustawia zdarzenie na stan zasygnalizowany.
resetować Ustawia zdarzenie na stan niesygnalizowany.
wait_for_multiple Czeka na sygnał wielu zdarzeń.

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