Spec-Zone.ru › Qt 5.15

Класс QReadWriteLock

Класс QReadWriteLock предоставляет механизм блокировки с чтением и записью. Подробнее...

Заголовок: #include <QReadWriteLock>
qmake: QT += core
  • Список всех членов, включая унаследованные

Примечание: Все функции в этом классе являются безопасными для потоков.

Типы публичного доступа

перечисление RecursionMode { Recursive, NonRecursive }

Функции публичного доступа

QReadWriteLock(QReadWriteLock::RecursionMode recursionMode = NonRecursive)
~QReadWriteLock()
void lockForRead()
void lockForWrite()
bool tryLockForRead()
bool tryLockForRead(int timeout)
bool tryLockForWrite()
bool tryLockForWrite(int timeout)
void unlock()

Подробное описание

Блокировка с чтением и записью — это инструмент синхронизации для защиты ресурсов, к которым можно получить доступ для чтения и записи. Этот тип блокировки полезен, если вы хотите разрешить нескольким потокам одновременный доступ только для чтения, но как только один поток захочет записать в ресурс, все остальные потоки должны быть заблокированы до завершения записи.

Во многих случаях QReadWriteLock является прямым конкурентом QMutex. QReadWriteLock — хороший выбор, если есть много одновременных операций чтения, а запись выполняется редко.

Пример:

QReadWriteLock lock;

void ReaderThread::run()
{
    ...
    lock.lockForRead();
    read_file();
    lock.unlock();
    ...
}

void WriterThread::run()
{
    ...
    lock.lockForWrite();
    write_file();
    lock.unlock();
    ...
}

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

Как и QMutex, QReadWriteLock может быть рекурсивно заблокирован одним и тем же потоком, когда он создан с QReadWriteLock::Recursive в качестве QReadWriteLock::RecursionMode. В таких случаях unlock() должен вызываться такое же количество раз, сколько раз был вызван lockForWrite() или lockForRead(). Обратите внимание, что тип блокировки не может быть изменен при попытке рекурсивной блокировки, т.е. невозможно заблокировать для чтения в потоке, который уже заблокирован для записи (и наоборот).

См. также QReadLocker, QWriteLocker, QMutex и QSemaphore.

Документация по типам членов

перечисление QReadWriteLock::RecursionMode

Константа Значение Описание
QReadWriteLock::Recursive 1 В этом режиме поток может многократно блокировать тот же QReadWriteLock. QReadWriteLock не будет разблокирован до тех пор, пока не будет выполнено соответствующее количество вызовов unlock().
QReadWriteLock::NonRecursive 0 В этом режиме поток может заблокировать QReadWriteLock только один раз.

Это перечисление было введено или изменено в Qt 4.4.

См. также QReadWriteLock().

Документация по функциям членов

QReadWriteLock::QReadWriteLock(QReadWriteLock::RecursionMode recursionMode = NonRecursive)

Создаёт объект QReadWriteLock в заданном режиме recursionMode.

По умолчанию режим рекурсии — NonRecursive.

Эта функция была введена в Qt 4.4.

См. также lockForRead(), lockForWrite() и RecursionMode.

QReadWriteLock::~QReadWriteLock()

Удаляет объект QReadWriteLock.

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

void QReadWriteLock::lockForRead()

Блокирует блокировку для чтения. Эта функция заблокирует текущий поток, если другой поток заблокировал её для записи.

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

См. также unlock(), lockForWrite() и tryLockForRead().

void QReadWriteLock::lockForWrite()

Блокирует блокировку для записи. Эта функция заблокирует текущий поток, если другой поток (включая текущий) заблокировал её для чтения или записи (если блокировка не была создана с режимом QReadWriteLock::Recursive).

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

См. также unlock(), lockForRead() и tryLockForWrite().

bool QReadWriteLock::tryLockForRead()

Пытается заблокировать для чтения. Если блокировка была получена, эта функция возвращает true, в противном случае возвращает false, вместо ожидания, пока блокировка станет доступной, т.е. не блокируется.

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

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

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

См. также unlock() и lockForRead().

bool QReadWriteLock::tryLockForRead(int timeout)

Это перегруженная функция.

Пытается заблокировать для чтения. Эта функция возвращает true если блокировка была получена; в противном случае она возвращает false. Если другой поток заблокировал блокировку для записи, эта функция будет ждать не более timeout миллисекунд, пока блокировка не станет доступной.

Примечание: Передача отрицательного числа в качестве timeout эквивалентна вызову lockForRead(), т.е. эта функция будет ждать вечно, пока блокировка не сможет быть заблокирована для чтения, когда timeout отрицательный.

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

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

См. также unlock() и lockForRead().

bool QReadWriteLock::tryLockForWrite()

Пытается заблокировать для записи. Если блокировка была получена, эта функция возвращает true; в противном случае — false немедленно.

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

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

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

См. также unlock() и lockForWrite().

bool QReadWriteLock::tryLockForWrite(int timeout)

Это перегруженная функция.

Пытается заблокировать для записи. Эта функция возвращает true если блокировка была получена; в противном случае — false. Если другой поток заблокировал блокировку для чтения или записи, эта функция будет ждать не более timeout миллисекунд, пока блокировка не станет доступной.

Примечание: Передача отрицательного числа в качестве timeout эквивалентна вызову lockForWrite(), т.е. эта функция будет ждать вечно, пока блокировка не сможет быть заблокирована для записи, когда timeout отрицательный.

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

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

См. также unlock() и lockForWrite().

void QReadWriteLock::unlock()

Разблокирует блокировку.

END_OF_DOCUMENT_MARKER ```

Попытка разблокировать незапертый замок — ошибка, которая приведёт к завершению программы.

См. также lockForRead(), lockForWrite(), tryLockForRead(), и tryLockForWrite().

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qreadwritelock.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API