Spec-Zone.ru › Qt 5.13

Класс 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

Spec-Zone.ru

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