Структуры данных синхронизацииSynchronization Data Structures

Среда выполнения с параллелизмом предоставляет несколько структур данных, которые позволяют синхронизировать доступ к общим данным из нескольких потоков.The Concurrency Runtime provides several data structures that let you synchronize access to shared data from multiple threads. Эти структуры данных полезны при нечастом изменении общих данных.These data structures are useful when you have shared data that you modify infrequently. Объект синхронизации, например критический раздел, заставляет другие потоки ожидать, пока общий ресурс не станет доступным.A synchronization object, for example, a critical section, causes other threads to wait until the shared resource is available. Таким образом, если вы используете такой объект для синхронизации доступа к часто используемым данным, можно потерять масштабируемость в приложении.Therefore, if you use such an object to synchronize access to data that is used frequently, you can lose scalability in your application. Библиотека Parallel Patterns (PPL) предоставляет класс Concurrency:: combinable , который позволяет совместно использовать ресурс в нескольких потоках или задачах без необходимости синхронизации.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. Дополнительные сведения о combinable классе см. в разделе Parallel Containers and Objects.For more information about the combinable class, see Parallel Containers and Objects.

СвященSections

В этом разделе подробно описаны следующие типы асинхронных блоков сообщений:This topic describes the following asynchronous message block types in detail:

critical_sectioncritical_section

Класс Concurrency:: critical_section представляет объект совместного взаимного исключения, который передает другие задачи вместо того, чтобы прерывать их.The concurrency::critical_section class represents a cooperative mutual exclusion object that yields to other tasks instead of preempting them. Критические разделы полезны, когда нескольким потокам требуется эксклюзивный доступ на чтение и запись к общим данным.Critical sections are useful when multiple threads require exclusive read and write access to shared data.

critical_sectionКласс не допускает повторных поправ.The critical_section class is non-reentrant. Метод Concurrency:: critical_section:: Lock вызывает исключение типа concurrency:: improper_lock , если оно вызывается потоком, который уже владеет блокировкой.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.

Методы и функцииMethods and Features

В следующей таблице показаны важные методы, определяемые critical_section классом.The following table shows the important methods that are defined by the critical_section class.

МетодMethod ОписаниеDescription
locklock Получает критическую секцию.Acquires the critical section. Контекст вызова блокируется до получения блокировки.The calling context blocks until it acquires the lock.
try_locktry_lock Пытается получить критическую секцию, но не блокируется.Tries to acquire the critical section, but does not block.
блокированunlock Освобождает критическую секцию.Releases the critical section.

[Top][Top]

reader_writer_lockreader_writer_lock

Класс Concurrency:: reader_writer_lock предоставляет потокобезопасные операции чтения и записи для общих данных.The concurrency::reader_writer_lock class provides thread-safe read/write operations to shared data. Используйте блокировки потоков чтения/записи, когда нескольким потокам требуется одновременный доступ на чтение к общему ресурсу, но редко осуществляется запись в этот общий ресурс.Use reader/writer locks when multiple threads require concurrent read access to a shared resource but rarely write to that shared resource. Этот класс предоставляет только одному потоку доступ на запись к объекту в любое время.This class gives only one thread write access to an object at any time.

reader_writer_lockКласс может работать лучше, чем critical_section класс, так как critical_section объект получает монопольный доступ к общему ресурсу, что предотвращает одновременный доступ на чтение.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.

Как и critical_section класс, reader_writer_lock класс представляет объект совместного взаимного исключения, который передает другие задачи вместо того, чтобы прерывать их.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.

Когда поток, который должен выполнить запись в общий ресурс, получает блокировку потоков чтения/записи, другие потоки, которые также должны обращаться к ресурсу, блокируются до тех пор, пока модуль записи не освободит блокировку.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Класс является примером блокировки записи , которая является блокировкой, которая разблокирует ожидающие модули записи перед разблокированием ожидающих потоков чтения.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.

Как и critical_section класс, reader_writer_lock класс не допускает повторных поправ.Like the critical_section class, the reader_writer_lock class is non-reentrant. Методы Concurrency:: reader_writer_lock:: Lock и concurrency:: reader_writer_lock:: lock_read создают исключение типа, improper_lock если они вызываются потоком, который уже владеет блокировкой.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.

Примечание

Так как reader_writer_lock класс не является недопустимым, вы не можете обновить блокировку только для чтения до блокировки потоков чтения/записи или понизить блокировку чтения/записи до блокировки только для чтения.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. Выполнение любой из этих операций приводит к неопределенному поведению.Performing either of these operations produces unspecified behavior.

Методы и функцииMethods and Features

В следующей таблице показаны важные методы, определяемые reader_writer_lock классом.The following table shows the important methods that are defined by the reader_writer_lock class.

МетодMethod ОписаниеDescription
locklock Получает доступ на чтение и запись к блокировке.Acquires read/write access to the lock.
try_locktry_lock Пытается получить доступ на чтение и запись к блокировке, но не блокируется.Tries to acquire read/write access to the lock, but does not block.
lock_readlock_read Получает доступ к блокировке только для чтения.Acquires read-only access to the lock.
try_lock_readtry_lock_read Пытается получить доступ к блокировке только для чтения, но не блокируется.Tries to acquire read-only access to the lock, but does not block.
блокированunlock Снимает блокировку.Releases the lock.

[Top][Top]

scoped_lock и scoped_lock_readscoped_lock and scoped_lock_read

critical_sectionКлассы и reader_writer_lock предоставляют вложенные вспомогательные классы, которые упрощают работу с взаимоисключающими объектами.The critical_section and reader_writer_lock classes provide nested helper classes that simplify the way you work with mutual exclusion objects. Эти вспомогательные классы известны как блокировки с областью действия.These helper classes are known as scoped locks.

critical_sectionКласс содержит класс Concurrency:: critical_section:: scoped_lock .The critical_section class contains the concurrency::critical_section::scoped_lock class. Конструктор получает доступ к предоставленному critical_section объекту; Деструктор освобождает доступ к этому объекту.The constructor acquires access to the provided critical_section object; the destructor releases access to that object. reader_writer_lockКласс содержит класс Concurrency:: reader_writer_lock:: scoped_lock , который похож на critical_section::scoped_lock , за исключением того, что он управляет доступом на запись к предоставленному reader_writer_lock объекту.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Класс также содержит класс Concurrency:: reader_writer_lock:: scoped_lock_read .The reader_writer_lock class also contains the concurrency::reader_writer_lock::scoped_lock_read class. Этот класс управляет доступом на чтение к предоставленному reader_writer_lock объекту.This class manages read access to the provided reader_writer_lock object.

Блокировки с заданной областью предоставляют несколько преимуществ при работе critical_section с reader_writer_lock объектами и вручную.Scoped locks provide several benefits when you are working with critical_section and reader_writer_lock objects manually. Как правило, в стеке выделяется блокировка с заданной областью.Typically, you allocate a scoped lock on the stack. Блокировка с заданной областью освобождает доступ к объекту взаимного исключения автоматически при его уничтожении. Таким образом, базовый объект не разблокируется вручную.A scoped lock releases access to its mutual exclusion object automatically when it is destroyed; therefore, you do not manually unlock the underlying object. Это полезно, если функция содержит несколько return инструкций.This is useful when a function contains multiple return statements. Блокировки с заданной областью также могут помочь при написании кода, безопасного с помощью исключений.Scoped locks can also help you write exception-safe code. Если throw инструкция вызывает очистку стека, вызывается деструктор любой активной блокировки с областью действия, поэтому объект взаимного исключения всегда освобождается правильно.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.

Примечание

При использовании critical_section::scoped_lock reader_writer_lock::scoped_lock классов, и не reader_writer_lock::scoped_lock_read следует вручную освобождать доступ к базовому взаимоисключающему объекту.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. В результате среда выполнения может находиться в недопустимом состоянии.This can put the runtime in an invalid state.

Событие event

Класс Concurrency:: Event представляет объект синхронизации, состояние которого может быть сигнальным или несигнальным.The concurrency::event class represents a synchronization object whose state can be signaled or non-signaled. В отличие от объектов синхронизации, таких как критические разделы, цель которых заключается в защите доступа к общим данным, события синхронизируют поток выполнения.Unlike synchronization objects, such as critical sections, whose purpose is to protect access to shared data, events synchronize flow of execution.

eventКласс полезен, когда одна задача завершила работу для другой задачи.The event class is useful when one task has completed work for another task. Например, одна задача может сообщить другой задаче о том, что она читает данные из сетевого подключения или из файла.For example, one task might signal another task that it has read data from a network connection or from a file.

Методы и функцииMethods and Features

В следующей таблице показаны некоторые важные методы, определяемые event классом.The following table shows several of the important methods that are defined by the event class.

МетодMethod ОписаниеDescription
ожиданияwait Ожидает сигнала события.Waits for the event to become signaled.
setset Устанавливает событие в сигнальное состояние.Sets the event to the signaled state.
resetreset Устанавливает событие в несигнальное состояние.Sets the event to the non-signaled state.
wait_for_multiplewait_for_multiple Ожидает получения сигнала для нескольких событий.Waits for multiple events to become signaled.

ПримерExample

Пример, демонстрирующий использование event класса, см. в разделе Сравнение структур данных синхронизации с API Windows.For an example that shows how to use the event class, see Comparing Synchronization Data Structures to the Windows API.

[Top][Top]

Сравнение структур данных синхронизации с API WindowsComparing Synchronization Data Structures to the Windows API
Сравнивает поведение структур данных синхронизации с теми, которые предоставляются API-интерфейсом Windows.Compares the behavior of the synchronization data structures to those provided by the Windows API.

Среда выполнения с параллелизмомConcurrency Runtime
Описывает среду выполнения с параллелизмом, которая упрощает процесс параллельного программирования и содержит ссылки на соответствующие разделы.Describes the Concurrency Runtime, which simplifies parallel programming, and contains links to related topics.