PySide6.QtCore.QSemaphoreReleaser¶
- class QSemaphoreReleaser¶
QSemaphoreReleaser
类提供了对release()
调用的异常安全延迟。更多…概要¶
方法¶
def
__init__()
def
cancel()
def
semaphore()
def
swap()
注意
本文档可能包含从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 –
QSemaphore
n – 整数
构造函数。存储参数并在析构函数中调用
sem
.release(n
)。- __init__(sem[, n=1])
- Parameters:
sem –
QSemaphore
n – 整数
构造函数。存储参数并在析构函数中调用
sem
->release(n
)。- cancel()¶
- Return type:
警告
本节包含从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
对象的指针,或者由最后一次移动赋值提供的指针(如果有)。否则,返回None
。- swap(other)¶
- Parameters:
其他 –
QSemaphoreReleaser
交换
*this
和other
的职责。与移动赋值不同,交换时两个对象都不会释放其信号量(如果有的话)。
因此,这个函数非常快且永远不会失败。