このページでは

QSemaphoreReleaser Class

QSemaphoreReleaser クラスは、QSemaphore::release() の呼び出しを例外安全に延期する機能を提供します。詳細...

ヘッダー: #include <QSemaphoreReleaser>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

注:このクラスのすべての関数は再入可能です。

パブリック関数

QSemaphoreReleaser()
QSemaphoreReleaser(QSemaphore &sem, int n = 1)
QSemaphoreReleaser(QSemaphore *sem, int n = 1)
QSemaphoreReleaser(QSemaphoreReleaser &&other)
~QSemaphoreReleaser()
QSemaphore *cancel()
QSemaphore *semaphore() const
void swap(QSemaphoreReleaser &other)
QSemaphoreReleaser &operator=(QSemaphoreReleaser &&other)

詳細な説明

QSemaphoreReleaser は、QSemaphore::release() を使用する場面であればどこでも使用できます。QSemaphoreReleaser を生成すると、QSemaphoreReleaser が破棄されるまで、セマフォに対する release() の呼び出しが延期されます(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

QSemaphoreReleaserは、cancel()を呼び出すことでキャンセルできます。キャンセルされたセマフォリリーサーは、そのデストラクタ内でQSemaphore::release()を呼び出しなくなります。

QMutexLockerも参照してください 。

メンバ関数のドキュメント

[constexpr noexcept default] QSemaphoreReleaser::QSemaphoreReleaser()

デフォルトコンストラクタ。何もしない QSemaphoreReleaser を作成します。

[explicit noexcept] QSemaphoreReleaser::QSemaphoreReleaser(QSemaphore &sem, int n = 1)

コンストラクタ。引数を格納し、デストラクタ内で `sem.release(n)` を呼び出します。

[explicit noexcept] QSemaphoreReleaser::QSemaphoreReleaser(QSemaphore *sem, int n = 1)

コンストラクタ。引数を格納し、デストラクタ内で `sem->release(n)` を呼び出します。

[noexcept] QSemaphoreReleaser::QSemaphoreReleaser(QSemaphoreReleaser &&other)

移動コンストラクタ。other からQSemaphore::release()の呼び出しを継承し、 はキャンセルされます。

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] void QSemaphoreReleaser::swap(QSemaphoreReleaser &other)

*this とother の役割を入れ替えます。

move代入とは異なり、スワップの結果として、2つのオブジェクトのいずれも(もしあれば)セマフォを解放することはありません。

したがって、この関数は非常に高速であり、失敗することはありません。

[noexcept] QSemaphoreReleaser &QSemaphoreReleaser::operator=(QSemaphoreReleaser &&other)

代入演算子を移動します。other からQSemaphore::release() を呼び出す役割を引き継ぎ、 はキャンセルされます。

このセマフォ解放関数が、何らかのQSemaphore::release() を自ら呼び出す責任を負っている場合、other から処理を引き継ぐ前に、その呼び出しを実行します。

cancel()も参照してください 。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.