Spec-Zone.ru › Qt

Класс QReadWriteLock

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

Заголовок: #include <QReadWriteLock>
CMake: find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core)
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 только один раз.

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

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

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

Конструирует объект QReadWriteLock в заданном recursionMode.

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

См. также 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()

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

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

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

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

Spec-Zone.ru

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