QSemaphoreReleaser#

The QSemaphoreReleaser class provides exception-safe deferral of a release() call. More

Synopsis#

Functions#

Note

This documentation may contain snippets that were automatically translated from C++ to Python. We always welcome contributions to the snippet translation. If you see an issue with the translation, you can also let us know by creating a ticket on https:/bugreports.qt.io/projects/PYSIDE

Detailed Description#

Warning

This section contains snippets that were automatically translated from C++ to Python and may contain errors.

QSemaphoreReleaser can be used wherever you would otherwise use release() . Constructing a QSemaphoreReleaser defers the release() call on the semaphore until the QSemaphoreReleaser is destroyed (see RAII pattern ).

You can use this to reliably release a semaphore to avoid dead-lock in the face of exceptions or early returns:

# ... do something that may throw or return early
sem.release()

If an early return is taken or an exception is thrown before the sem.release() call is reached, the semaphore is not released, possibly preventing the thread waiting in the corresponding sem.acquire() call from ever continuing execution.

When using RAII instead:

releaser = QSemaphoreReleaser(sem)
# ... do something that may throw or early return
# implicitly calls sem.release() here and at every other return in between

this can no longer happen, because the compiler will make sure that the QSemaphoreReleaser destructor is always called, and therefore the semaphore is always released.

QSemaphoreReleaser is move-enabled and can therefore be returned from functions to transfer responsibility for releasing a semaphore out of a function or a scope:

{ // some scope
    QSemaphoreReleaser releaser # does nothing
    # ...
    if someCondition:
        releaser = QSemaphoreReleaser(sem)
        # ...

    # ...
} // conditionally calls sem.release(), depending on someCondition

A QSemaphoreReleaser can be canceled by a call to cancel() . A canceled semaphore releaser will no longer call release() in its destructor.

See also

QMutexLocker

class PySide6.QtCore.QSemaphoreReleaser#

PySide6.QtCore.QSemaphoreReleaser(sem[, n=1])

PySide6.QtCore.QSemaphoreReleaser(sem[, n=1])

Parameters:

Default constructor. Creates a QSemaphoreReleaser that does nothing.

Constructor. Stores the arguments and calls sem.release(n) in the destructor.

Constructor. Stores the arguments and calls sem->release(n) in the destructor.

PySide6.QtCore.QSemaphoreReleaser.cancel()#
Return type:

PySide6.QtCore.QSemaphore

Warning

This section contains snippets that were automatically translated from C++ to Python and may contain errors.

Cancels this QSemaphoreReleaser such that the destructor will no longer call semaphore()->release(). Returns the value of semaphore() before this call. After this call, semaphore() will return None.

To enable again, assign a new QSemaphoreReleaser :

releaser.cancel() # avoid releasing old semaphore()
releaser = QSemaphoreReleaser(sem, 42)
# now will call sem.release(42) when 'releaser' is destroyed
PySide6.QtCore.QSemaphoreReleaser.semaphore()#
Return type:

PySide6.QtCore.QSemaphore

Returns a pointer to the QSemaphore object provided to the constructor, or by the last move assignment, if any. Otherwise, returns None.

PySide6.QtCore.QSemaphoreReleaser.swap(other)#
Parameters:

otherPySide6.QtCore.QSemaphoreReleaser

Exchanges the responsibilities of *this and other.

Unlike move assignment, neither of the two objects ever releases its semaphore, if any, as a consequence of swapping.

Therefore this function is very fast and never fails.