Qt 信号量 QSemaphore Class 的翻译
關(guān)于 Qt QSemaphore class 的翻譯
Qt 的 QSemaphore class 提供了一個通用的信號量(可以是單一的,也可以是數(shù)量多個的)的使用方法。
需要編輯環(huán)境添加:
Header: #include <QSemaphore> qmake: QT += core公共函數(shù):
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)一些細節(jié)的描述:
1、信號量本質(zhì)上是一個互斥鎖(mutex),但是又有區(qū)別。
互斥鎖只能鎖一次,然而信號量可以多次。
打個比方,在早餐餐廳,大家要喝咖啡。如果用Mutex的方式,同時只有一個人可以使用咖啡機,他獲得了咖啡機的使用權(quán)后,開始做咖啡,其他人只能在旁邊等著,直到他做好咖啡后,另外一個人才能獲得咖啡機的使用權(quán)。
如果用Semaphore的模式,服務(wù)員會把咖啡做好放到柜臺上,誰想喝咖啡就拿走一杯,服務(wù)員會不斷做咖啡,如果咖啡杯被拿光了,想喝咖啡的人就排隊等著。
2、信號量典型的應(yīng)用是在某些共享的資源上。
3、信號量支持兩個基本的操作acquire() and release():
- acquire(n) :嘗試獲取n個資源,如果這些n個資源尚不可用,那么線程會一直阻塞直到資源可用為止。
- release(n):釋放n個資源
- tryAcquire() 會立即返回資源是否可用
- available() 會返回當(dāng)前有多少資源可用
例如:
QSemaphore sem(5); // sem.available() == 5sem.acquire(3); // sem.available() == 2 sem.acquire(2); // sem.available() == 0 sem.release(5); // sem.available() == 5 sem.release(5); // sem.available() == 10sem.tryAcquire(1); // sem.available() == 9, returns true sem.tryAcquire(250); // sem.available() == 9, returns false一個典型的關(guān)于信號量的應(yīng)用,是共享環(huán)形緩存(循環(huán)隊列)的使用,具體可以查看示例Semaphores Example。
打個比方,去餐廳就餐。信號量初始為餐廳的座位數(shù),如果客人來了,想就餐。于是一位一位入座,剩余的座位就少了,available()返回的值就減少了。如果客離開了,那剩余的座位就多了,available()返回的值就增多了。那樣就可以接待更多的客人了。
如果來了10個客人,而座位只有9個,那么這10個人需要等待。
但是具體處理時這樣的:如果當(dāng)時有5個座位空余,那么這10人中5人可以入座,剩余4人繼續(xù)等待。
成員函數(shù)介紹:
QSemaphore::QSemaphore(int n = 0)
構(gòu)建一個新的信號量,初始化資源數(shù)(類似上面提到的座位號)為0。
QSemaphore::~QSemaphore()
銷毀信號量
void QSemaphore::acquire(int n = 1)
獲取n個資源,默認為1,如果n>available(),線程將阻塞,一直等到足夠的資源為止。
int QSemaphore::available() const
返回當(dāng)前可用的資源
void QSemaphore::release(int n = 1)
釋放n個資源,默認資源數(shù)為1
該函數(shù)還可以自動構(gòu)建資源片
例如:
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 resourcesbool QSemaphore::tryAcquire(int n = 1)
嘗試獲取n個資源
例如:
QSemaphore sem(5); // sem.available() == 5 sem.tryAcquire(250); // sem.available() == 5, returns false sem.tryAcquire(3); // sem.available() == 2, returns truebool QSemaphore::tryAcquire(int n, int timeout)
嘗試獲取n個資源,超時時間為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 waitingQt 中關(guān)于信號量的介紹就這些,本篇翻譯結(jié)束。
總結(jié)
以上是生活随笔為你收集整理的Qt 信号量 QSemaphore Class 的翻译的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt 并行计算圆周率示例
- 下一篇: Qt 互斥锁 QMutex 的简单应用