QSemaphoreReleaser 类
QSemaphoreReleaser 类提供了一个安全地延迟 QSemaphore::release() 调用的功能。有关更多信息,请参阅 更多...
头文件 | #include <QSemaphoreReleaser> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += core |
- 包括继承成员在内的所有成员列表
- QSemaphoreReleaser 是线程类的一部分。Threading Classes.
注意: 此类中所有函数都是可重入的。
公共函数
QSemaphoreReleaser() | |
QSemaphoreReleaser(QSemaphore <i>sem</i>, int <i>n</i> = 1) | |
QSemaphoreReleaser(QSemaphore * <i>sem</i>, int <i>n</i> = 1) | |
QSemaphoreReleaser(QSemaphoreReleaser <&><i>other</i>) | |
~QSemaphoreReleaser() | |
QSemaphore * | cancel() |
QSemaphore * | semaphore() const |
void | swap(QSemaphoreReleaser <&><i>other</i>) |
QSemaphoreReleaser <&> | operator=(QSemaphoreReleaser <&><i>other</i>) |
详细说明
可以在需要使用 QSemaphore::release() 的任何地方使用 QSemaphoreReleaser。构建 QSemaphoreReleaser 会将 release() 调用延迟到 QSemaphoreReleaser 被销毁(请参阅 RAII 模式)。
您可以使用此功能在异常或提前返回的情况下可靠地释放信号量,以避免死锁
// ... do something that may throw or return early sem.release();
如果在到达 sem.release() 调用之前发生提前返回或抛出异常,信号量将不会被释放,这可能会阻止在相应的 sem.acquire() 调用中等待的线程继续执行。
当使用 RAII 时
const QSemaphoreReleaser releaser(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。取消的信号量释放器在其析构函数中将不再调用 QSemaphore::release()。
另请参阅:QMutexLocker.
成员函数文档
[constexpr noexcept]
QSemaphoreReleaser::QSemaphoreReleaser()
默认构造函数。创建一个什么也不做的 QSemaphoreReleaser。
[显式noexcept]
QSemaphoreReleaser::QSemaphoreReleaser(QSemaphore &sem, int n = 1)
构造函数。存储参数并在析构函数中调用 sem.release(n)。
[显式noexcept]
QSemaphoreReleaser::QSemaphoreReleaser(QSemaphore *sem, int n = 1)
构造函数。存储参数并在析构函数中调用 sem->release(n)。
[noexcept]
QSemaphoreReleaser::QSemaphoreReleaser(QSemaphoreReleaser &&other)
移动构造函数。接管从 other 调用 QSemaphore::release() 的责任,而 other 则会被取消。
另请参阅 cancel().
[noexcept]
QSemaphoreReleaser::~QSemaphoreReleaser()
除非被取消,否则会在析构函数中调用 QSemaphore::release(),参数由构造函数提供,或者由最后的移动赋值提供。
[noexcept]
QSemaphore *QSemaphoreReleaser::cancel()
取消这个 QSemaphoreReleaser,这样析构函数将不再调用 semaphore()->release()
。返回调用之前的 semaphore() 的值。在这个调用之后,semaphore() 将返回 nullptr
。
要再次启用,分配一个新的 QSemaphoreReleaser
releaser.cancel(); // avoid releasing old semaphore() releaser = QSemaphoreReleaser(sem, 42); // now will call sem.release(42) when 'releaser' is destroyed
[noexcept]
QSemaphore *QSemaphoreReleaser::semaphore() const
返回指向构造函数提供的 QSemaphore 对象的指针,或者由最后的移动赋值提供的,如果没有,则返回 nullptr
。
[noexcept]
QSemaphoreReleaser &QSemaphoreReleaser::swap(QSemaphoreReleaser &other)
交换 *this
和 other 的责任。
与移动赋值不同,在交换过程中,两个对象中任何一个都不会释放其信号量(如果有的话)。
因此该函数非常快且永远不会失败。
[noexcept]
QSemaphoreReleaser &QSemaphoreReleaser::operator=(QSemaphoreReleaser &&other)
移动赋值运算符。接管从 other 调用 QSemaphore::release() 的责任,而 other 则会被取消。
如果这个信号量释放器本身有责任调用某个 QSemaphore::release(),则在接管之前执行该调用。
另请参阅 cancel().
© 2024 The Qt Company Ltd. 本文档中包含的贡献的文档版权归各自的所有者所有。提供的文档根据 Free Software Foundation 作为其发布的 GNU 自由文档许可证版本 1.3 的条款进行许可。Qt 以及相应的标志是 The Qt Company Ltd. 在芬兰和/或其他国家的商标。所有其他商标均为其各自所有者的财产。