Класс QSemaphoreReleaser
Класс QSemaphoreReleaser предоставляет безопасную от исключений отсрочку вызова QSemaphore::release(). Подробнее...
| Заголовок: | #include <QSemaphoreReleaser> |
| qmake: | QT += core |
| С тех пор: | Qt 5.10 |
Примечание: Все функции в этом классе являются входными.
Открытые функции
| QSemaphoreReleaser() | |
| QSemaphoreReleaser(QSemaphore &sem, int n = 1) | |
| QSemaphoreReleaser(QSemaphore *sem, int n = 1) | |
| QSemaphoreReleaser(QSemaphoreReleaser &&other) | |
| ~QSemaphoreReleaser() | |
| QSemaphore * | cancel() |
| QSemaphore * | semaphore() const |
| void | swap(QSemaphoreReleaser &other) |
| QSemaphoreReleaser & | operator=(QSemaphoreReleaser &&other) |
Подробное описание
Класс QSemaphoreReleaser предоставляет безопасную от исключений отсрочку вызова QSemaphore::release().
QSemaphoreReleaser может быть использован там, где иначе использовался QSemaphore::release(). Создание QSemaphoreReleaser откладывает вызов release() на семафоре до уничтожения QSemaphoreReleaser (см. паттерн RAII).
Вы можете использовать это для надежной разблокировки семафора, чтобы избежать тупика в случае исключений или ранних возвратов:
// ... do something that may throw or return early sem.release();
Если выполняется раннее возвращение или возникает исключение до достижения вызова sem.release(), семафор не разблокируется, что, возможно, помешает потоку, ожидающему в соответствующем вызове sem.acquire(), когда-либо продолжить выполнение.
При использовании RAII вместо этого:
const QSemaphoreReleaser releaser(sem); // ... do something that may throw or early return // implicitly calls sem.release() here and at every other return in between
это больше не может произойти, потому что компилятор гарантирует, что деструктор QSemaphoreReleaser всегда вызывается, и, следовательно, семафор всегда разблокируется.
QSemaphoreReleaser поддерживает перемещение и, следовательно, может возвращаться из функций для передачи ответственности за разблокировку семафора из функции или области видимости:
{ // some scope
QSemaphoreReleaser releaser; // does nothing
// ...
if (someCondition) {
releaser = QSemaphoreReleaser(sem);
// ...
}
// ...
} // conditionally calls sem.release(), depending on someCondition QSemaphoreReleaser можно отменить вызовом cancel(). Отмененный QSemaphoreReleaser больше не будет вызывать QSemaphore::release() в своём деструкторе.
См. также QMutexLocker.
Документация по функциям-членам
QSemaphoreReleaser::QSemaphoreReleaser()
Конструктор по умолчанию. Создаёт QSemaphoreReleaser, который ничего не делает.
QSemaphoreReleaser::QSemaphoreReleaser(QSemaphore &sem, int n = 1)
Конструктор. Сохраняет аргументы и вызывает sem.release(n) в деструкторе.
QSemaphoreReleaser::QSemaphoreReleaser(QSemaphore *sem, int n = 1)
Конструктор. Сохраняет аргументы и вызывает sem->release(n) в деструкторе.
QSemaphoreReleaser::QSemaphoreReleaser(QSemaphoreReleaser &&other)
Конструктор перемещения. Принимает на себя ответственность за вызов QSemaphore::release() от other, который в свою очередь отменяется.
См. также cancel().
QSemaphoreReleaser::~QSemaphoreReleaser()
Если не отменено, вызывает QSemaphore::release() с аргументами, предоставленными в конструкторе, или последним присваиванием по ссылке.
QSemaphore *QSemaphoreReleaser::cancel()
Отменяет этот QSemaphoreReleaser, так что деструктор больше не будет вызывать semaphore()->release(). Возвращает значение semaphore() до этого вызова. После этого вызова semaphore() вернёт nullptr.
Чтобы снова включить, присвойте новый QSemaphoreReleaser:
releaser.cancel(); // avoid releasing old semaphore() releaser = QSemaphoreReleaser(sem, 42); // now will call sem.release(42) when 'releaser' is destroyed
QSemaphore *QSemaphoreReleaser::semaphore() const
Возвращает указатель на объект QSemaphore, предоставленный в конструкторе, или последним присваиванием по ссылке, если таковое имеется. В противном случае возвращает nullptr.
void QSemaphoreReleaser::swap(QSemaphoreReleaser &other)
Меняет обязанности *this и other.
В отличие от присваивания по ссылке, ни один из двух объектов никогда не разблокирует свой семафор, если таковой имеется, в результате обмена.
Поэтому эта функция очень быстрая и никогда не завершается неудачей.
QSemaphoreReleaser &QSemaphoreReleaser::operator=(QSemaphoreReleaser &&other)
Оператор присваивания по ссылке. Принимает на себя ответственность за вызов QSemaphore::release() от other, который в свою очередь отменяется.
Если этот семафорный разблокировщик был ответственен за вызов какого-либо QSemaphore::release() сам, он выполняет вызов перед тем, как принять ответственность от other.
См. также cancel().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.11/qsemaphorereleaser.html