Класс QSemaphoreReleaser
Класс QSemaphoreReleaser предоставляет безопасный от исключений механизм отсрочки вызова QSemaphore::release(). Подробнее...
| Заголовок: | #include <QSemaphoreReleaser> |
| qmake: | QT += core |
| С момента: | Qt 5.10 |
Этот класс был представлен в Qt 5.10.
Примечание: Все функции в этом классе являются реентерабельными.
Открытые функции
| QSemaphoreReleaser(QSemaphoreReleaser &&other) | |
| QSemaphoreReleaser(QSemaphore *sem, int n = 1) | |
| QSemaphoreReleaser(QSemaphore &sem, int n = 1) | |
| QSemaphoreReleaser() | |
| QSemaphoreReleaser & | operator=(QSemaphoreReleaser &&other) |
| ~QSemaphoreReleaser() | |
| QSemaphore * | cancel() |
| QSemaphore * | semaphore() const |
| void | swap(QSemaphoreReleaser &other) |
Подробное описание
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 &&other)
Конструктор перемещения. Принимает на себя ответственность за вызов QSemaphore::release() из other, который в свою очередь отменяется.
См. также cancel().
QSemaphoreReleaser::QSemaphoreReleaser(QSemaphore *sem, int n = 1)
Конструктор. Сохраняет аргументы и вызывает sem->release(n) в деструкторе.
QSemaphoreReleaser::QSemaphoreReleaser(QSemaphore &sem, int n = 1)
Конструктор. Сохраняет аргументы и вызывает sem.release(n) в деструкторе.
QSemaphoreReleaser::QSemaphoreReleaser()
Конструктор по умолчанию. Создаёт QSemaphoreReleaser, который ничего не делает.
QSemaphoreReleaser &QSemaphoreReleaser::operator=(QSemaphoreReleaser &&other)
Оператор присваивания перемещением. Принимает на себя ответственность за вызов QSemaphore::release() из 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.
В отличие от оператора присваивания перемещением, ни один из двух объектов никогда не разблокирует свой семафор в результате обмена.
Поэтому эта функция очень быстрая и никогда не терпит неудачу.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/qsemaphorereleaser.html