- 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
可以通过调用
cancel()
来取消QSemaphoreReleaser
。已取消的信号释放器在其析构函数中将不再调用release()
。另请参阅
QMutexLocker
- __init__()#
默认构造函数。创建一个什么也不做的
QSemaphoreReleaser
。- __init__(sem[, n=1])
- 参数:
sem –
QSemaphore
n – int
构造函数。存储参数,并在析构函数中调用
sem
.release(n
)。- __init__(sem[, n=1])
- 参数:
sem –
QSemaphore
n – int
构造函数。存储参数,并在析构函数中调用
sem
->release(n
)。- cancel()#
- 返回类型:
警告
本节包含自动从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
对象的指针,或者最后移动赋值,如果有的话。否则,返回None
。- swap(other)#
- 参数:
other –
QSemaphoreReleaser
交换
*this
和other
的职责。与移动赋值不同,在交换过程中,两个对象中的任何一个都不会因为交换而释放其信号量(如果有的话)。
因此此函数非常快且从不失败。