The QSemaphore class provides a general counting semaphore. 更多...
| 頭: | #include <QSemaphore> |
| 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) |
| bool | tryAcquire (int n , int timeout ) |
The QSemaphore class provides a general counting semaphore.
信號量是一般化的互斥。盡管互斥隻可以鎖定一次,但多次獲得信號量是可能的。信號量通常用於保護一定數量的恒等資源。
信號量支持 2 基礎操作 acquire () 和 release ():
還有 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 to solve that problem.
信號量的非計算範例是在餐館用餐。采用餐廳中的椅子數初始信號量。當人們到達時,他們想要座位。由於座無虛席, available () 遞減。當人們離開時, available () 增加,允許更多人進入。若要坐 10 人的宴會,卻隻有 9 個席位,這 10 人會等待,但要坐 4 人的宴會 (把可用座位增加到 5,使 10 人的宴會等待更長時間)。
另請參閱 QSemaphoreReleaser , QMutex , QWaitCondition , QThread ,和 信號量範例 .
Creates a new semaphore and initializes the number of resources it guards to n (默認 0)。
另請參閱 release () 和 available ().
銷毀信號量。
警告: Destroying a semaphore that is in use may result in undefined behavior.
試著獲得
n
由信號量守衛的資源。若
n
>
available
(), this call will block until enough resources are available.
另請參閱 release (), available (),和 tryAcquire ().
Returns the number of resources currently available to the semaphore. This number can never be negative.
發行 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 .
試著獲得
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 ().
試著獲得
n
由信號量守衛的資源並返迴
true
當成功時。若
available
() <
n
, this call will wait for at most
timeout
milliseconds for resources to become available.
注意:傳遞負數作為 timeout 相當於調用 acquire (), i.e. this function will wait forever for resources to become available if 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 ().