QSemaphore Class
QSemaphoreクラスは、一般的な計数セマフォを提供します。詳細...
ヘッダ | #include <QSemaphore> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
- 継承されたメンバを含む全メンバのリスト
- QSemaphoreはスレッドクラスに属しています。
注意:このクラスの関数はすべてスレッドセーフです。
パブリック関数
QSemaphore(int n = 0) | |
~QSemaphore() | |
void | acquire(int n = 1) |
int | available() const |
void | release(int n = 1) |
bool | tryAcquire(int n = 1) |
(since 6.6) bool | tryAcquire(int n, QDeadlineTimer timer) |
bool | tryAcquire(int n, int timeout) |
(since 6.3) bool | tryAcquire(int n, std::chrono::duration<Rep, Period> timeout) |
(since 6.3) bool | try_acquire() |
(since 6.3) bool | try_acquire_for(const std::chrono::duration<Rep, Period> &timeout) |
(since 6.3) bool | try_acquire_until(const std::chrono::time_point<Clock, Duration> &tp) |
詳細説明
セマフォはミューテックスを一般化したものです。ミューテックスは一度しかロックできませんが、セマフォは複数回取得できます。セマフォは通常、ある数の同一のリソースを保護するために使用される。
セマフォは、acquire ()とrelease ()という2つの基本的な操作をサポートしています:
- acquire(n)はn個のリソースを獲得しようとします。acquire(n)はn個のリソースを獲得しようとします。利用可能なリソースがそれほど多くない場合、この呼び出しはそうなるまでブロックされます。
- release(n)はn個のリソースを解放する。
また、tryAcquire ()関数もあり、リソースを取得できない場合は即座に戻ります。available ()関数は、いつでも利用可能なリソースの数を返します。
例
QSemaphore sem(5); // sem.available() == 5 sem.acquire(3); // sem.available() == 2 sem.acquire(2); // sem.available() == 0 sem.release(5); // sem.available() == 5 sem.release(5); // sem.available() == 10 sem.tryAcquire(1); // sem.available() == 9, returns true sem.tryAcquire(250); // sem.available() == 9, returns false
セマフォの典型的なアプリケーションは、プロデューサースレッドとコンシューマースレッドが共有する円形バッファへのアクセスを制御することである。ProducerとConsumer using Semaphoresの例では、QSemaphoreを使用してこの問題を解決する方法を示しています。
セマフォのコンピュータ以外の例としては、レストランでの食事が挙げられる。セマフォはレストランの椅子の数で初期化される。人々がやってくると、彼らは席を欲しがる。席が埋まると、available ()がデクリメントされる。人々が席を立つと、available() がインクリメントされ、より多くの人々が入店できるようになる。10人のパーティが席に着きたいのに席が9つしかない場合、その10人は待つことになるが、4人のパーティは席に着くことになる(空席が5つになり、10人のパーティを長く待たせることになる)。
QSemaphoreReleaser,QMutex,QWaitCondition,QThread, およびセマフォを使ったProducerとConsumerも参照のこと 。
メンバ関数のドキュメント
[explicit]
QSemaphore::QSemaphore(int n = 0)
新しいセマフォを作成し、ガードするリソース数をn に初期化する(デフォルトは 0)。
release() およびavailable()も参照のこと 。
[noexcept]
QSemaphore::~QSemaphore()
セマフォを破壊する。
警告 使用中のセマフォを破棄すると、未定義の動作になる可能性があります。
void QSemaphore::acquire(int n = 1)
セマフォによってガードされているn
リソースの獲得を試みる。n >available()の場合、十分なリソースが利用可能になるまで、この呼び出しはブロックされる。
release()、available()、tryAcquire()も参照のこと 。
int QSemaphore::available() const
この関数は、セマフォが現在利用可能なリソースの数を返します。この数が負になることはありません。
acquire() およびrelease()も参照のこと 。
void QSemaphore::release(int n = 1)
n セマフォによって保護されているリソースを解放する。
この関数は、リソースの「作成」にも使用できる。例えば
QSemaphore sem(5); // a semaphore that guards 5 resources sem.acquire(5); // acquire all 5 resources sem.release(5); // release the 5 resources sem.release(10); // "create" 10 new resources
QSemaphoreReleaser はこの関数のRAIIラッパーです。
acquire()、available()、QSemaphoreReleaserも参照のこと 。
bool QSemaphore::tryAcquire(int n = 1)
セマフォによってガードされているn
リソースの獲得を試み、成功するとtrue
を返す。available() <n の場合、この呼び出しはリソースを獲得せずに直ちにfalse
を返す。
例:
QSemaphore sem(5); // sem.available() == 5 sem.tryAcquire(250); // sem.available() == 5, returns false sem.tryAcquire(3); // sem.available() == 2, returns true
acquire()も参照のこと 。
[since 6.6]
bool QSemaphore::tryAcquire(int n, QDeadlineTimer timer)
セマフォによってガードされているn
リソースの獲得を試み、成功するとtrue
を返す。available() <n の場合、この呼び出しはtimer の有効期限が切れるまで、リソースが利用可能になるまで待つ。
例
QSemaphore sem(5); // sem.available() == 5 sem.tryAcquire(250, QDeadlineTimer(1000)); // sem.available() == 5, waits 1000 milliseconds and returns false sem.tryAcquire(3, QDeadlineTimer(30s)); // sem.available() == 2, returns true without waiting
この関数は Qt 6.6 で導入されました。
acquire()も参照してください 。
bool QSemaphore::tryAcquire(int n, int timeout)
セマフォによってガードされているn
リソースの獲得を試み、成功するとtrue
を返す。available() <n の場合、この呼び出しはリソースが利用可能になるまで最大でtimeout ミリ秒待つ。
注意:timeout に負の数を渡すと、acquire() を呼び出すのと同じことになる。つまり、timeout が負の場合、この関数はリソースが利用可能になるまで永遠に待つことになる。
例:
QSemaphore sem(5); // sem.available() == 5 sem.tryAcquire(250, 1000); // sem.available() == 5, waits 1000 milliseconds and returns false sem.tryAcquire(3, 30000); // sem.available() == 2, returns true without waiting
acquire()も参照のこと 。
[since 6.3]
template <typename Rep, typename Period> bool QSemaphore::tryAcquire(int n, std::chrono::duration<Rep, Period> timeout)
これはオーバーロードされた関数です。
この関数は Qt 6.3 で導入されました。
[noexcept, since 6.3]
bool QSemaphore::try_acquire()
この関数はstd::counting_semaphore
との互換性のために提供されている。
この関数はtryAcquire(1)
を呼び出すのと同じで、リソースの取得に成功するとtrue
を返します。
この関数はQt 6.3で導入されました。
tryAcquire(),try_acquire_for(),try_acquire_until()も参照してください 。
[since 6.3]
template <typename Rep, typename Period> bool QSemaphore::try_acquire_for(const std::chrono::duration<Rep, Period> &timeout)
この関数はstd::counting_semaphore
との互換性のために提供されている。
この関数は、tryAcquire(1, timeout)
を呼び出すのと等価であり、与えられたtimeout の値でタイムアウトする。この関数は、リソースの取得に成功するとtrue
を返します。
この関数は Qt 6.3 で導入されました。
tryAcquire(),try_acquire(),try_acquire_until()も参照してください 。
[since 6.3]
template <typename Clock, typename Duration> bool QSemaphore::try_acquire_until(const std::chrono::time_point<Clock, Duration> &tp)
この関数はstd::counting_semaphore
との互換性のために提供されている。
これは、tryAcquire(1, tp - Clock::now())
を呼び出すのと等価である。つまり、tp (時点)が記録され、待機中のClock
の調整は無視される。この関数は、リソースの取得に成功するとtrue
を返します。
この関数はQt 6.3で導入されました。
tryAcquire(),try_acquire(),try_acquire_for()も参照してください 。
© 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.