Spec-Zone.ru › Qt 6.1

Класс QSemaphoreReleaser

Класс QSemaphoreReleaser предоставляет безопасное от исключений отложенное выполнение вызова QSemaphore::release(). Подробнее...

Заголовок: #include <QSemaphoreReleaser>
CMake: find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
С тех пор: 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, который, в свою очередь, отменяется.

Если у этого объекта QSemaphoreReleaser была ответственность за вызов 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-6.1/qsemaphorereleaser.html

Spec-Zone.ru

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