Struktury danych synchronizacjiSynchronization Data Structures

Środowisko uruchomieniowe współbieżności zapewnia kilka struktur danych, które pozwalają synchronizować dostęp do danych udostępnionych z wielu wątków.The Concurrency Runtime provides several data structures that let you synchronize access to shared data from multiple threads. Te struktury danych są przydatne, gdy dane udostępnione są modyfikowane rzadko.These data structures are useful when you have shared data that you modify infrequently. Obiekt synchronizacji, na przykład sekcję krytyczną, powoduje, że inne wątki oczekują na dostęp do zasobu udostępnionego.A synchronization object, for example, a critical section, causes other threads to wait until the shared resource is available. W związku z tym, jeśli używasz takiego obiektu do synchronizowania dostępu do danych, które są często używane, możesz utracić skalowalność aplikacji.Therefore, if you use such an object to synchronize access to data that is used frequently, you can lose scalability in your application. Biblioteka równoległych wzorców (PPL) udostępnia klasę concurrency::Binding , która umożliwia udostępnianie zasobu między kilkoma wątkami lub zadaniami bez konieczności synchronizacji.The Parallel Patterns Library (PPL) provides the concurrency::combinable class, which enables you to share a resource among several threads or tasks without the need for synchronization. Aby uzyskać więcej informacji na temat combinable klasy, zobacz Parallel Containers and Objects.For more information about the combinable class, see Parallel Containers and Objects.

PoszczególneSections

W tym temacie opisano szczegółowo następujące typy bloków komunikatów asynchronicznych:This topic describes the following asynchronous message block types in detail:

critical_sectioncritical_section

Klasa concurrency:: critical_section reprezentuje wspólny obiekt wykluczenia, który uzyskuje inne zadania, zamiast przekazywać je.The concurrency::critical_section class represents a cooperative mutual exclusion object that yields to other tasks instead of preempting them. Sekcje krytyczne są przydatne, gdy wiele wątków wymaga wyłącznego dostępu do odczytu i zapisu do udostępnionych danych.Critical sections are useful when multiple threads require exclusive read and write access to shared data.

critical_sectionKlasa nie jest współużytkowana.The critical_section class is non-reentrant. 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.The concurrency::critical_section::lock method throws an exception of type concurrency::improper_lock if it is called by the thread that already owns the lock.

Metody i funkcjeMethods and Features

W poniższej tabeli przedstawiono ważne metody, które są zdefiniowane przez critical_section klasę.The following table shows the important methods that are defined by the critical_section class.

MetodaMethod OpisDescription
skrętlock Uzyskuje sekcję krytyczną.Acquires the critical section. Wywołanie bloku kontekstu do momentu uzyskania blokady.The calling context blocks until it acquires the lock.
try_locktry_lock Próbuje uzyskać sekcję krytyczną, ale nie blokuje.Tries to acquire the critical section, but does not block.
odblokowaniaunlock Zwalnia sekcję krytyczną.Releases the critical section.

[Top][Top]

reader_writer_lockreader_writer_lock

Klasa concurrency:: reader_writer_lock zapewnia bezpieczne dla wątków operacje odczytu/zapisu do udostępnionych danych.The concurrency::reader_writer_lock class provides thread-safe read/write operations to shared data. Użyj blokady czytnika/składnika zapisywania, gdy wiele wątków wymaga jednoczesnego dostępu do odczytu do zasobu udostępnionego, ale rzadko zapisuj w tym udostępnionym zasobie.Use reader/writer locks when multiple threads require concurrent read access to a shared resource but rarely write to that shared resource. Ta klasa daje tylko jeden wątek zapisu do obiektu w dowolnym momencie.This class gives only one thread write access to an object at any time.

reader_writer_lockKlasa może działać lepiej niż Klasa, critical_section ponieważ critical_section obiekt uzyskuje wyłączny dostęp do zasobu udostępnionego, co uniemożliwi dostęp współbieżny do odczytu.The reader_writer_lock class can perform better than the critical_section class because a critical_section object acquires exclusive access to a shared resource, which prevents concurrent read access.

Podobnie jak critical_section Klasa, reader_writer_lock Klasa reprezentuje wspólny obiekt wykluczenia, który uzyskuje inne zadania, zamiast przekazywać je.Like the critical_section class, the reader_writer_lock class represents a cooperative mutual exclusion object that yields to other tasks instead of preempting them.

Gdy wątek, który musi zapisywać w udostępnionym zasobie, uzyskuje blokadę czytnika/składnika zapisywania, inne wątki, które również muszą uzyskać dostęp do zasobu, są blokowane do momentu zwolnienia blokady przez moduł zapisujący.When a thread that must write to a shared resource acquires a reader/writer lock, other threads that also must access the resource are blocked until the writer releases the lock. reader_writer_lockKlasa jest przykładem blokady typu zapis-preferencja , która jest blokadą, która odblokowuje blokowanych autorów przed odblokowaniem oczekujących czytników.The reader_writer_lock class is an example of a write-preference lock, which is a lock that unblocks waiting writers before it unblocks waiting readers.

Podobnie jak critical_section Klasa, reader_writer_lock Klasa nie jest współużytkowana.Like the critical_section class, the reader_writer_lock class is non-reentrant. Metody concurrency:: reader_writer_lock:: Lock i concurrency:: reader_writer_lock:: lock_read zwracają wyjątek typu, improper_lock Jeśli są wywoływane przez wątek, który jest już właścicielem blokady.The concurrency::reader_writer_lock::lock and concurrency::reader_writer_lock::lock_read methods throw an exception of type improper_lock if they are called by a thread that already owns the lock.

Uwaga

Ponieważ reader_writer_lock Klasa nie jest współużytkowana, nie można uaktualnić blokady tylko do odczytu do blokady czytnika/składnika zapisywania ani obniżenia poziomu blokady czytnika/składnika zapisywania do blokady tylko do odczytu.Because the reader_writer_lock class is non-reentrant, you cannot upgrade a read-only lock to a reader/writer lock or downgrade a reader/writer lock to a read-only lock. Wykonanie jednej z tych operacji powoduje nieokreślone zachowanie.Performing either of these operations produces unspecified behavior.

Metody i funkcjeMethods and Features

W poniższej tabeli przedstawiono ważne metody, które są zdefiniowane przez reader_writer_lock klasę.The following table shows the important methods that are defined by the reader_writer_lock class.

MetodaMethod OpisDescription
skrętlock Uzyskuje dostęp do odczytu i zapisu do blokady.Acquires read/write access to the lock.
try_locktry_lock Próbuje uzyskać dostęp do odczytu/zapisu do blokady, ale nie blokuje.Tries to acquire read/write access to the lock, but does not block.
lock_readlock_read Uzyskuje dostęp tylko do odczytu do blokady.Acquires read-only access to the lock.
try_lock_readtry_lock_read Próbuje uzyskać dostęp tylko do odczytu do blokady, ale nie blokuje.Tries to acquire read-only access to the lock, but does not block.
odblokowaniaunlock Zwalnia blokadę.Releases the lock.

[Top][Top]

scoped_lock i scoped_lock_readscoped_lock and scoped_lock_read

critical_sectionKlasy i reader_writer_lock udostępniają zagnieżdżone klasy pomocnicze, które upraszczają sposób pracy z obiektami wzajemnego wykluczania.The critical_section and reader_writer_lock classes provide nested helper classes that simplify the way you work with mutual exclusion objects. Te klasy pomocnika są nazywane blokadami objętymi zakresem.These helper classes are known as scoped locks.

critical_sectionKlasa zawiera klasę concurrency:: critical_section:: scoped_lock .The critical_section class contains the concurrency::critical_section::scoped_lock class. Konstruktor uzyskuje dostęp do podanego critical_section obiektu. destruktor zwalnia dostęp do tego obiektu.The constructor acquires access to the provided critical_section object; the destructor releases access to that object. reader_writer_lockKlasa zawiera klasę concurrency:: reader_writer_lock:: scoped_lock , która przypomina critical_section::scoped_lock , z tą różnicą, że zarządza dostępem do zapisu do podanego reader_writer_lock obiektu.The reader_writer_lock class contains the concurrency::reader_writer_lock::scoped_lock class, which resembles critical_section::scoped_lock, except that it manages write access to the provided reader_writer_lock object. reader_writer_lockKlasa zawiera również klasę concurrency:: reader_writer_lock:: scoped_lock_read .The reader_writer_lock class also contains the concurrency::reader_writer_lock::scoped_lock_read class. Ta klasa zarządza dostępem do odczytu do podanego reader_writer_lock obiektu.This class manages read access to the provided reader_writer_lock object.

Blokady z zakresami zapewniają kilka korzyści, gdy pracujesz critical_section z reader_writer_lock obiektami i ręcznie.Scoped locks provide several benefits when you are working with critical_section and reader_writer_lock objects manually. Zwykle przypisujesz blokadę z zakresu na stosie.Typically, you allocate a scoped lock on the stack. Blokada zakresu zwalnia dostęp do jego wzajemnego wykluczenia, gdy zostanie zniszczony; w związku z tym nie należy ręcznie odblokować bazowego obiektu.A scoped lock releases access to its mutual exclusion object automatically when it is destroyed; therefore, you do not manually unlock the underlying object. Jest to przydatne, gdy funkcja zawiera wiele return instrukcji.This is useful when a function contains multiple return statements. Blokady w zakresie mogą również pomóc w pisaniu kodu z bezpiecznymi wyjątkami.Scoped locks can also help you write exception-safe code. Gdy throw instrukcja powoduje cofnięcie stosu, destruktor dla każdej aktywnej blokady z zakresem jest wywoływany, w związku z czym wzajemny wykluczenie jest zawsze prawidłowo wydane.When a throw statement causes the stack to unwind, the destructor for any active scoped lock is called, and therefore the mutual exclusion object is always correctly released.

Uwaga

W przypadku korzystania z critical_section::scoped_lock klas, i nie należy ręcznie wydawania reader_writer_lock::scoped_lock reader_writer_lock::scoped_lock_read dostępu do podstawowego obiektu wykluczenia.When you use the critical_section::scoped_lock, reader_writer_lock::scoped_lock, and reader_writer_lock::scoped_lock_read classes, do not manually release access to the underlying mutual exclusion object. Może to spowodować wystąpienie środowiska uruchomieniowego w nieprawidłowym stanie.This can put the runtime in an invalid state.

wydarzenevent

Klasa concurrency:: Event reprezentuje obiekt synchronizacji, którego stan może być sygnalizowane lub nie jest sygnałem.The concurrency::event class represents a synchronization object whose state can be signaled or non-signaled. W przeciwieństwie do obiektów synchronizacji, takich jak sekcje krytyczne, których celem jest ochrona dostępu do danych udostępnionych, synchronizacja zdarzeń przebiegu wykonywania.Unlike synchronization objects, such as critical sections, whose purpose is to protect access to shared data, events synchronize flow of execution.

eventKlasa jest przydatna, gdy jedno zadanie zakończyło pracę nad innym zadaniem.The event class is useful when one task has completed work for another task. Na przykład jedno zadanie może sygnalizować inne zadanie, że odczytaje dane z połączenia sieciowego lub z pliku.For example, one task might signal another task that it has read data from a network connection or from a file.

Metody i funkcjeMethods and Features

W poniższej tabeli przedstawiono kilka ważnych metod, które są zdefiniowane przez event klasę.The following table shows several of the important methods that are defined by the event class.

MetodaMethod OpisDescription
trwawait Czeka, aż zdarzenie zostanie zasygnalizowane.Waits for the event to become signaled.
zbiórset Ustawia zdarzenie na sygnał.Sets the event to the signaled state.
zresetowaćreset Ustawia dla zdarzenia niesygnalizowanego stanu.Sets the event to the non-signaled state.
wait_for_multiplewait_for_multiple Czeka na zasygnalizowanie wielu zdarzeń.Waits for multiple events to become signaled.

PrzykładExample

Aby zapoznać się z przykładem, który pokazuje event , jak używać klasy, zobacz Porównywanie struktur danych synchronizacji z interfejsem API systemu Windows.For an example that shows how to use the event class, see Comparing Synchronization Data Structures to the Windows API.

[Top][Top]

Porównywanie struktur danych synchronizacji z interfejsem API systemu WindowsComparing Synchronization Data Structures to the Windows API
Porównuje zachowanie struktur danych synchronizacji z tymi, które są udostępniane przez interfejs API systemu Windows.Compares the behavior of the synchronization data structures to those provided by the Windows API.

Współbieżność środowiska wykonawczegoConcurrency Runtime
Opisuje środowisko uruchomieniowe współbieżności, które upraszczają programowanie równoległe i zawiera linki do powiązanych tematów.Describes the Concurrency Runtime, which simplifies parallel programming, and contains links to related topics.