Notatka
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 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]
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 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.