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

Среда выполнения параллелизма предоставляет несколько структур данных, которые позволяют синхронизировать доступ к общим данным из нескольких потоков. Эти структуры данных полезны при использовании общих данных, которые редко изменяются. Объект синхронизации, например, критически важный раздел, приводит к тому, что другие потоки будут ожидать, пока общий ресурс не будет доступен. Таким образом, если вы используете такой объект для синхронизации доступа к данным, которые часто используются, вы можете потерять масштабируемость в приложении. Библиотека параллельных шаблонов (PPL) предоставляет класс параллелизма::комбинируемый класс, который позволяет совместно использовать ресурс между несколькими потоками или задачами без необходимости синхронизации. Дополнительные сведения о классе см. в разделе "Параллельные combinable контейнеры и объекты".

Разделы

В этом разделе подробно описаны следующие типы блоков асинхронных сообщений:

critical_section

Класс параллелизма::critical_section представляет совместный объект взаимного исключения, который дает другим задачам вместо их предварительного использования. Критические разделы полезны, если для нескольких потоков требуется эксклюзивный доступ на чтение и запись к общим данным.

Класс critical_section не является повторным. Метод параллелизма::critical_section::lock вызывает исключение параллелизма типа ::improper_lock если он вызывается потоком, который уже владеет блокировкой.

Методы и компоненты

В следующей таблице показаны важные методы, определенные классом critical_section .

Способ Описание
lock Получает критически важный раздел. Вызывающий контекст блокируется до тех пор, пока он не получит блокировку.
try_lock Пытается получить критически важный раздел, но не блокируется.
unlock Освобождает критически важный раздел.

[В начало]

reader_writer_lock

Класс параллелизма::reader_writer_lock предоставляет потокобезопасные операции чтения и записи для общих данных. Используйте блокировки чтения и записи, если для нескольких потоков требуется одновременный доступ на чтение к общему ресурсу, но редко записывается в этот общий ресурс. Этот класс предоставляет только один поток записи к объекту в любое время.

Класс reader_writer_lock может работать лучше, чем critical_section класс, так как critical_section объект получает монопольный доступ к общему ресурсу, что предотвращает одновременный доступ на чтение.

critical_section Как и класс, reader_writer_lock класс представляет совместный объект взаимного исключения, который дает другим задачам вместо их упреждения.

Когда поток, который должен записываться в общий ресурс, получает блокировку чтения или записи, другие потоки, которые также должны получать доступ к ресурсу, пока модуль записи не освобождает блокировку. Класс reader_writer_lock является примером блокировки предпочтения записи, которая является блокировкой, которая разблокирует записи ожидания, прежде чем разблокировать средства чтения ожидания.

critical_section Как и класс, reader_writer_lock класс не является повторным. Методы параллелизма::reader_writer_lock::lock и параллелизма::reader_writer_lock:: lock_read вызывают исключение типа improper_lock , если они вызываются потоком, который уже владеет блокировкой.

Примечание.

reader_writer_lock Так как класс не является повторным, вы не можете обновить блокировку только для чтения до блокировки чтения или записи или понижения уровня блокировки чтения или записи до блокировки только для чтения. Выполнение любой из этих операций приводит к неуказаенному поведению.

Методы и компоненты

В следующей таблице показаны важные методы, определенные классом reader_writer_lock .

Способ Описание
lock Получает доступ на чтение и запись к блокировке.
try_lock Пытается получить доступ на чтение и запись к блокировке, но не блокируется.
lock_read Получает доступ только для чтения к блокировке.
try_lock_read Пытается получить доступ только для чтения к блокировке, но не блокируется.
unlock Освобождает блокировку.

[В начало]

областьd_lock и областьd_lock_read

Классы critical_section и reader_writer_lock классы предоставляют вложенные вспомогательные классы, упрощающие работу с объектами взаимного исключения. Эти вспомогательные классы называются область блокировками.

Класс critical_section содержит класс параллелизма::critical_section::областьd_lock. Конструктор получает доступ к предоставленному critical_section объекту. Деструктор освобождает доступ к объекту. Класс reader_writer_lock содержит класс параллелизма::reader_writer_lock::областьd_lock, который напоминаетcritical_section::scoped_lock, за исключением того, что он управляет доступом записи к предоставленному reader_writer_lock объекту. Класс reader_writer_lock также содержит класс параллелизма::reader_writer_lock::областьd_lock_read. Этот класс управляет доступом на чтение к предоставленному reader_writer_lock объекту.

Блокировка с областью предоставляет несколько преимуществ при работе с critical_section объектами reader_writer_lock вручную. Как правило, вы выделяете область блокировку на стеке. При уничтожении область блокировка освобождает доступ к объекту взаимного исключения автоматически, поэтому не разблокируете базовый объект вручную. Это полезно, если функция содержит несколько return инструкций. Блоки с областью также могут помочь в написании кода, безопасного для исключений. throw Когда инструкция вызывает стек для очистки, вызывается деструктор для любой активной блокировки область d, поэтому объект взаимного исключения всегда освобождается правильно.

Примечание.

Если вы используете critical_section::scoped_lockклассы , reader_writer_lock::scoped_lockи reader_writer_lock::scoped_lock_read классы, не освобождайте вручную доступ к базовому объекту взаимного исключения. Это может поместить среду выполнения в недопустимое состояние.

события

Класс параллелизма::event представляет объект синхронизации, состояние которого может быть сигнализировано или не сигнализировано. В отличие от объектов синхронизации, таких как критически важные разделы, цель которых — защитить доступ к общим данным, события синхронизируют поток выполнения.

Класс event полезен, когда одна задача завершила работу для другой задачи. Например, одна задача может сигнализировать другой задаче о том, что она считывает данные из сетевого подключения или из файла.

Методы и компоненты

В следующей таблице показаны несколько важных методов, определенных классом event .

Способ Описание
Подожди Ожидает, пока событие станет сигналом.
set Задает событие сигнальным состоянием.
reset; Задает событие не сигнальным состоянием.
wait_for_multiple Ожидает передачи сигнала о нескольких событиях.

Пример

Пример использования event класса см. в разделе "Сравнение структур данных синхронизации" с API Windows.

[В начало]

Сравнение структур данных синхронизации с интерфейсом Windows API
Сравнивает поведение структур данных синхронизации с данными, предоставляемыми API Windows.

Среда выполнения с параллелизмом
Описывает среду выполнения с параллелизмом, которая упрощает процесс параллельного программирования и содержит ссылки на соответствующие разделы.