Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz 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:
sekcja krytyczna
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 |
|---|---|
| blokady | Uzyskuje sekcję krytyczną. Kontekst wywołujący blokuje się do momentu uzyskania blokady. |
| 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 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 |
|---|---|
| blokady | Uzyskuje dostęp do odczytu/zapisu do blokady. |
| 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 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.
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 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. |
| zestaw | 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.