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) |
詳細な説明
セマフォは、ミューテックスの一般化です。ミューテックスは 1 回しかロックできませんが、セマフォは複数回取得することができます。セマフォは通常、一定数の同一のリソースを保護するために使用されます。
セマフォは、acquire() およびrelease() の 2 つの基本的な操作をサポートしています。
- 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セマフォの典型的な用途は、プロデューサースレッドとコンシューマースレッドが共有する循環バッファへのアクセスを制御することです。「セマフォを使用したプロデューサーとコンシューマーの例」では、QSemaphore を使用してこの問題を解決する方法を示しています。
コンピュータ以外の分野におけるセマフォの例としては、レストランでの食事が挙げられます。セマフォは、レストランの席数で初期化されます。客が到着すると、席を求めます。席が埋まるたびに、available() がデクリメントされます。客が店を出ると、available() がインクリメントされ、より多くの客が入店できるようになります。 10人のグループが席を求めてきたものの、空席が9席しかない場合、その10人は待つことになりますが、4人のグループは席に着くことができます(これにより空席は5席となり、10人のグループはさらに長く待つことになります)。
関連項目: QSemaphoreReleaser 、QMutex 、QWaitCondition 、QThread 、および「セマフォを使用したプロデューサーとコンシューマー」。
メンバ関数のドキュメント
[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 resourcesQSemaphoreReleaser は、この関数をラップした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())` を呼び出すことと同等であり、待機中の `Clock ` に対する調整を無視して、tp (時点)が記録されることを意味します。この関数は、リソースの取得に成功すると `true ` を返します。
この関数は Qt 6.3 で導入されました。
tryAcquire()、try_acquire()、およびtry_acquire_for()も参照してください 。
© 2026 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.