QSemaphore Class

QSemaphoreクラスは、一般的な計数セマフォを提供します。詳細...

Header: #include <QSemaphore>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

注意:このクラスの関数はすべてスレッドセーフです。

パブリック関数

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

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