Класс 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.0/qreadwritelock.html