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_section
Klasa 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. |
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_lock
Klasa 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_lock
Klasa 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. |
scoped_lock i scoped_lock_readscoped_lock and scoped_lock_read
critical_section
Klasy 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_section
Klasa 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_lock
Klasa 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_lock
Klasa 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.
event
Klasa 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.
Sekcje pokrewneRelated Sections
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.