PySide6.QtCore.QSemaphoreReleaser

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

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

另请参阅

QMutexLocker

__init__()

默认构造函数。创建一个不执行任何操作的QSemaphoreReleaser

__init__(sem[, n=1])
Parameters:

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

__init__(sem[, n=1])
Parameters:

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

cancel()
Return type:

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()
Return type:

QSemaphore

返回指向提供给构造函数的QSemaphore对象的指针,或者由最后一次移动赋值提供的指针(如果有)。否则,返回None

swap(other)
Parameters:

其他QSemaphoreReleaser

交换 *thisother 的职责。

与移动赋值不同,交换时两个对象都不会释放其信号量(如果有的话)。

因此,这个函数非常快且永远不会失败。