QSemaphoreReleaser Class

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

Header: #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()も参照してください

本書に含まれる文書の著作権は、それぞれの所有者に帰属します 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。