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() | |
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)
*this
とother の責任を交換する。
移動の割り当てとは異なり、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.