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