Класс 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 обеспечивает блокировку чтения-записи.
Блокировка чтения-записи — это инструмент синхронизации для защиты ресурсов, к которым можно получить доступ для чтения и записи. Этот тип блокировки полезен, если вы хотите разрешить нескольким потокам одновременный доступ только для чтения, но как только один поток захочет записать в ресурс, все остальные потоки должны быть заблокированы до завершения записи.
Во многих случаях 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()
Разблокирует блокировку.
Попытка разблокировать блокировку, которая не заблокирована, является ошибкой и приведет к завершению программы.
См. также lockForRead(), lockForWrite(), tryLockForRead() и tryLockForWrite().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.12/qreadwritelock.html