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

デストラクタがsemaphore()->release() を呼び出さなくなるように、このQSemaphoreReleaser をキャンセルする。この呼び出しの前の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)

*thisother の責任を交換する。

移動の割り当てとは異なり、2つのオブジェクトのどちらもセマフォを解放することはない。

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

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

移動割り当て演算子。other からQSemaphore::release() を呼び出す責任を引き継ぎ、その責任はキャンセルされる。

このセマフォ解放者が、QSemaphore::release() を呼び出す責務を持っていた場合、other から引き継ぐ前に、その呼び出しを実行する。

cancel()も参照

© 2025 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.