Поделиться через


Класс reader_writer_lock

Блокировка чтения или записи на основе очередей с предпочтением записи только с локальным вращением. Блокировка предоставляет писателям доступ по принципу "первым пришел - первым получил" (FIFO) и лишает доступа читателей при постоянной нагрузке писателей.

Синтаксис

class reader_writer_lock;

Участники

Открытые классы

Имя Описание
Класс reader_writer_lock::scoped_lock Безопасная при исключениях оболочка RAII, которую можно использовать для захвата reader_writer_lock объектов блокировки для записи.
Класс reader_writer_lock::scoped_lock_read Безопасная при исключениях оболочка RAII, которую можно использовать для получения reader_writer_lock объектов блокировки как читатель.

Открытые конструкторы

Имя Описание
замок читателя/писателя Создает новый объект reader_writer_lock.
Деструктор ~reader_writer_lock Уничтожает reader_writer_lock объект.

Открытые методы

Имя Описание
блокировка Получает блокировку для чтения и записи в режиме записи.
блокировка_чтения Получает блокировку средства чтения и записи в качестве читателя. Если есть авторы, активные читатели должны ждать, пока они не закончат. Читатель просто регистрирует интерес к блокировке и ожидает, пока писатели её освободят.
try_lock Пытается получить блокировку для чтения-записи в качестве писателя, избегая блокировки.
try_lock_read Пытается получить блокировку для чтения-записи в режиме чтения, не блокируясь.
разблокировать Разблокирует блокировку типа читатель—писатель на основе того, кто ее заблокировал: читатель или писатель.

Замечания

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

Иерархия наследования

reader_writer_lock

Требования

Заголовок: concrt.h

Пространство имен: конкурентность

замок

Получает блокировку чтеца-писателя в качестве писателя.

void lock();

Замечания

Часто безопаснее использовать конструкцию scoped_lock для получения и освобождения объекта reader_writer_lock в качестве записывающего, обеспечивая безопасность при исключениях.

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

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

Если блокировка уже удерживается в контексте вызова, выбрасывается исключение improper_lock.

блокировка_чтения

Получает блокировку средства чтения и записи в качестве читателя. Если есть авторы, активные читатели должны ждать, пока они не закончат. Читатель просто регистрирует интерес к блокировке и ожидает, пока писатели её освободят.

void lock_read();

Замечания

Часто безопаснее использовать конструкцию scoped_lock_read для получения и освобождения reader_writer_lock объекта в качестве читателя, обеспечивая безопасность при возникновении исключений.

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

замок читателя-писателя

Создает новый объект reader_writer_lock.

reader_writer_lock();

~замок читателя/писателя

Уничтожает reader_writer_lock объект.

~reader_writer_lock();

Замечания

Ожидается, что блокировка больше не хранится при запуске деструктора. Если замок для чтения и записи будет разрушен при удержании замка, это приведет к неопределенному поведению.

Класс reader_writer_lock::scoped_lock

Безопасная при исключениях оболочка RAII, которую можно использовать для захвата reader_writer_lock объектов блокировки для записи.

class scoped_lock;

scoped_lock::scoped_lock

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

explicit _CRTIMP scoped_lock(reader_writer_lock& _Reader_writer_lock);

Параметры

_Reader_writer_lock
Объект reader_writer_lock , который требуется получить в качестве модуля записи.

scoped_lock::~scoped_lock

Уничтожает объект reader_writer_lock и освобождает блокировку, предоставленную в его конструкторе.

~scoped_lock();

Класс scoped_lock_read из reader_writer_lock

Безопасная при исключениях оболочка RAII, которую можно использовать для получения reader_writer_lock объектов блокировки как читатель.

class scoped_lock_read;

scoped_lock_read::scoped_lock_read

Создает объект scoped_lock_read и получает объект reader_writer_lock, переданный в параметре _Reader_writer_lock в качестве reader. Если блокировка удерживается другим потоком-писателем или есть ожидающие потоки-писатели, этот вызов будет заблокирован.

explicit _CRTIMP scoped_lock_read(reader_writer_lock& _Reader_writer_lock);

Параметры

_Блокировка читателя-писателя
Объект reader_writer_lock, который требуется получить для чтения.

reader_writer_lock::scoped_lock_read::~scoped_lock_read Деструктор

Уничтожает объект scoped_lock_read и освобождает блокировку, предоставленную в его конструкторе.

~scoped_lock_read();

try_lock

Пытается получить блокировку для чтения-записи в качестве писателя, избегая блокировки.

Синтаксис

bool try_lock();

Возвращаемое значение

Если блокировка была получена, значение true; в противном случае — значение false.

try_lock_read (попытка захвата блокировки для чтения)

Пытается получить блокировку для чтения-записи в режиме чтения, не блокируясь.

bool try_lock_read();

Возвращаемое значение

Если блокировка была приобретена, значение true; в противном случае — значение false.

разблокировать

Разблокирует блокировку типа читатель—писатель на основе того, кто ее заблокировал: читатель или писатель.

void unlock();

Замечания

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

См. также

Пространство имен параллелизм
Класс critical_section