Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ś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.