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_lock
klas , reader_writer_lock::scoped_lock
i 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]
Sekcje pokrewne
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.