QSemaphoreReleaser 类

QSemaphoreReleaser 类提供了一个安全地延迟 QSemaphore::release() 调用的功能。有关更多信息,请参阅 更多...

头文件 #include <QSemaphoreReleaser>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core

注意: 此类中所有函数都是可重入的。

公共函数

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
voidswap(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)

交换 *thisother 的责任。

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

因此该函数非常快且永远不会失败。

[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. 在芬兰和/或其他国家的商标。所有其他商标均为其各自所有者的财产。