Структуры данных синхронизации
Среда выполнения с параллелизмом предоставляет несколько структур данных, позволяющих синхронизировать доступ к совместно используемым данным из нескольких потоков.Эти структуры данных удобны для редко изменяемых совместно используемых данных.Объект синхронизации, например критическая секция, заставляет другие потоки ожидать, пока совместно используемый ресурс не станет доступен.Поэтому если использовать такой объект для синхронизации доступа к часто используемым данным, приложение может утратить масштабируемость.Библиотека параллельных шаблонов Обеспечивает concurrency::combinable класс, который обеспечивает совместное использование ресурсов между несколькими потоками или задач без необходимости синхронизации.Дополнительные сведения о классе combinable см. в разделе Параллельные контейнеры и объекты.
Подразделы
В этом разделе подробно рассматриваются следующие типы асинхронных блоков сообщений.
critical_section
reader_writer_lock
scoped_lock и scoped_lock_read
event
critical_section
Concurrency::critical_section класс представляет объект взаимного исключения совместно, дает другие задачи вместо приоритетного прерывания их.Критические секции удобны, когда нескольким потокам требуется эксклюзивный доступ к совместно используемым данным для чтения или записи.
Класс critical_section является нереентерабельным.Concurrency::critical_section::lock метод выдает исключение типа concurrency::improper_lock при вызове потоком, который уже владеет блокировкой.
Методы и свойства
В следующей таблице указаны важные методы, определяемые классом critical_section.
Метод |
Описание |
---|---|
Получает критическую секцию.Вызывающий контекст блокируется, пока не получит блокировку. |
|
Пытается получить критическую секцию, но не выполняет блокировку. |
|
Освобождает критическую секцию. |
Top
reader_writer_lock
Concurrency::reader_writer_lock класс предоставляет операции с потоками чтения и записи к общим данным.Используйте блокировки чтения/записи, если нескольким потокам требуется параллельный доступ на чтение из совместно используемого ресурса, а запись в этот совместно используемый ресурс производится редко.В любой момент времени этот класс предоставляет доступ для записи в этот объект только одному потоку.
Класс reader_writer_lock может обеспечивать большую производительность, чем класс critical_section, так как объект critical_section получает эксклюзивный доступ к совместно используемому ресурсу, исключающий параллельный доступ для чтения.
Как и класс critical_section, класс reader_writer_lock представляет собой кооперативный взаимоисключающий объект, который выдается другим задачам, а не завладевает ими.
Когда поток, который должен произвести запись в совместно используемый ресурс, получает блокировку чтения/записи, другие потоки, которым также необходим доступ к ресурсу, блокируются до тех пор, пока записывающий поток не снимет блокировку.Класс reader_writer_lock является примером блокировки предпочтения записи, которая разблокирует ожидающие записывающие потоки до разблокировки ожидающих читающих потоков.
Как и класс critical_section, класс reader_writer_lock является нереентерабельным.Concurrency::reader_writer_lock::lock и concurrency::reader_writer_lock::lock_read методы исключение типа improper_lock при вызове потоком, который уже владеет блокировкой.
Примечание |
---|
Поскольку класс reader_writer_lock не допускает повторные входы, невозможно повысить уровень блокировки только для чтения до блокировки чтения-записи, и наоборот.Выполнение любой из этих операций может привести к непредсказуемому поведению. |
Методы и свойства
В следующей таблице указаны важные методы, определяемые классом reader_writer_lock.
Метод |
Описание |
---|---|
Получает доступ к блокировке для чтения/записи. |
|
Пытается получить доступ к блокировке для чтения/записи, но не выполняет блокировку. |
|
Получает доступ только для чтения к блокировке. |
|
Пытается получить доступ только для чтения к блокировке, но не выполняет блокировку. |
|
Снимает блокировку. |
Top
scoped_lock и scoped_lock_read
Классы critical_section и reader_writer_lock предоставляют вложенные вспомогательные классы, упрощающие способ работы с взаимоисключающими объектами.Эти вспомогательные классы называются блокировками с областью.
critical_section Класс содержит concurrency::critical_section::scoped_lock класса.Конструктор получает доступ к предоставленному объекту critical_section; деструктор освобождает доступ к этому объекту.reader_writer_lock Класс содержит concurrency::reader_writer_lock::scoped_lock класс, который напоминает critical_section::scoped_lock, за исключением того, что управляет доступ на запись к предоставленным reader_writer_lock объект.reader_writer_lock Класс также содержит concurrency::reader_writer_lock::scoped_lock_read класса.Этот класс управляет доступом на чтение к предоставленному объекту reader_writer_lock.
Блокировки с областью имеют несколько преимуществ при работе с объектами critical_section и reader_writer_lock вручную.Обычно блокировка с областью размещается в стеке.Блокировка с областью освобождает доступ к своему взаимоисключающему объекту автоматически при ее уничтожении; поэтому не требуется вручную разблокировать основной объект.Это удобно, если функция содержит несколько операторов return.Блокировки с областью также помогают создавать код, безопасный в отношении исключений.Когда оператор throw вызывает раскручивание стека, вызываются деструкторы всех активных блокировок с областью, и поэтому взаимоисключающий объект всегда правильно освобождается.
Примечание |
---|
При использовании классов critical_section::scoped_lock, reader_writer_lock::scoped_lock и reader_writer_lock::scoped_lock_read не освобождайте доступ к основному взаимоисключающему объекту вручную.В результате среда выполнения может перейти в недопустимое состояние. |
event
Concurrency::event класс представляет объект синхронизации, состояние которого можно сигнала или не получает сигнал.В отличие от объектов синхронизации, например критичных участков, предназначенных для защиты доступа к совместно используемым данным, события синхронизируют последовательность выполнения.
Класс event удобен, когда одна задача завершила работу для другой задачи.Например, одна задача может сигнализировать другой задаче о завершении чтения данных из сетевого подключения или из файла.
Методы и свойства
В следующей таблице указаны несколько важных методов, определяемых классом event.
Метод |
Описание |
---|---|
Ожидает перехода события в сигнальное состояние. |
|
Устанавливает событие в сигнальное состояние. |
|
Устанавливает событие в несигнальное состояние. |
|
Ожидает, пока несколько событий перейдут в сигнальное состояние. |
Пример
Пример, показывающий использование класса event, см. в разделе Сравнение структур данных синхронизации с интерфейсом Windows API.
Top
Связанные разделы
Сравнение структур данных синхронизации с интерфейсом Windows API
Сравнивает поведение структур синхронизации данных с поведением структур, предоставляемых Windows API.Среда выполнения с параллелизмом
Описывает среду выполнения с параллелизмом, которая упрощает процесс параллельного программирования, и содержит ссылки на соответствующие разделы.