class QSemaphoreReleaser#

QSemaphoreReleaser类提供了异常安全的延迟调用release()方法。更多...

摘要#

方法#

注意

本文档可能包含自动从C++转换为Python的代码片段。我们始终欢迎对片段翻译的贡献。如果您发现翻译有任何问题,也可以通过在https:/bugreports.qt.io/projects/PYSIDE创建票据来告诉我们。

详细描述#

警告

本节包含自动从C++转换为Python的代码片段,可能包含错误。

QSemaphoreReleaser 可以在任何您原本会使用 release() 的地方使用。创建一个 QSemaphoreReleaser 将推迟对信号的 release() 调用,直到 QSemaphoreReleaser 被销毁(参见 RAII 模式 )。

您可以使用它来可靠地释放信号,避免在出现异常或提前返回时发生死锁。

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

如果在达到 sem.release() 调用之前发生提前返回或抛出异常,则不会释放信号,这可能会阻止等待在对应 sem.acquire() 调用中的线程继续执行。

当使用 RAII 时

releaser = QSemaphoreReleaser(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

可以通过调用 cancel() 来取消 QSemaphoreReleaser 。已取消的信号释放器在其析构函数中将不再调用 release()

另请参阅

QMutexLocker

__init__()#

默认构造函数。创建一个什么也不做的 QSemaphoreReleaser

__init__(sem[, n=1])
参数:

构造函数。存储参数,并在析构函数中调用 sem.release(n)。

__init__(sem[, n=1])
参数:

构造函数。存储参数,并在析构函数中调用 sem->release(n)。

cancel()#
返回类型:

QSemaphore

警告

本节包含自动从C++转换为Python的代码片段,可能包含错误。

取消此 QSemaphoreReleaser,使得析构函数将不再调用 semaphore()->release()。在调用此函数之前返回 semaphore() 的值。调用此函数后,semaphore() 将返回 None

要再次启用,请分配一个新的 QSemaphoreReleaser

releaser.cancel() # avoid releasing old semaphore()
releaser = QSemaphoreReleaser(sem, 42)
# now will call sem.release(42) when 'releaser' is destroyed
semaphore()#
返回类型:

QSemaphore

返回一个指向在构造函数中提供的 QSemaphore 对象的指针,或者最后移动赋值,如果有的话。否则,返回 None

swap(other)#
参数:

otherQSemaphoreReleaser

交换 *thisother 的职责。

与移动赋值不同,在交换过程中,两个对象中的任何一个都不会因为交换而释放其信号量(如果有的话)。

因此此函数非常快且从不失败。