Qt 信號量 QSemaphore Class 的翻譯

關於 Qt QSemaphore class 的翻譯

Qt 的 QSemaphore class 提供了一個通用的信號量(可以是單一的,也可以是數量多個的)的使用方法。

需要編輯環境添加:

Header:	#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)

一些細節的描述:
1、信號量本質上是一個互斥鎖(mutex),但是又有區別。
互斥鎖只能鎖一次,然而信號量可以多次。
打個比方,在早餐餐廳,大家要喝咖啡。如果用Mutex的方式,同時只有一個人可以使用咖啡機,他獲得了咖啡機的使用權後,開始做咖啡,其他人只能在旁邊等着,直到他做好咖啡後,另外一個人才能獲得咖啡機的使用權。

如果用Semaphore的模式,服務員會把咖啡做好放到櫃檯上,誰想喝咖啡就拿走一杯,服務員會不斷做咖啡,如果咖啡杯被拿光了,想喝咖啡的人就排隊等着。

2、信號量典型的應用是在某些共享的資源上。

3、信號量支持兩個基本的操作acquire() and release():

  • acquire(n) :嘗試獲取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

一個典型的關於信號量的應用,是共享環形緩存(循環隊列)的使用,具體可以查看示例Semaphores Example。

打個比方,去餐廳就餐。信號量初始爲餐廳的座位數,如果客人來了,想就餐。於是一位一位入座,剩餘的座位就少了,available()返回的值就減少了。如果客離開了,那剩餘的座位就多了,available()返回的值就增多了。那樣就可以接待更多的客人了。
如果來了10個客人,而座位只有9個,那麼這10個人需要等待。
但是具體處理時這樣的:如果當時有5個座位空餘,那麼這10人中5人可以入座,剩餘4人繼續等待。

成員函數介紹:
QSemaphore::QSemaphore(int n = 0)
構建一個新的信號量,初始化資源數(類似上面提到的座位號)爲0。

QSemaphore::~QSemaphore()
銷燬信號量

void QSemaphore::acquire(int n = 1)
獲取n個資源,默認爲1,如果n>available(),線程將阻塞,一直等到足夠的資源爲止。

int QSemaphore::available() const
返回當前可用的資源

void QSemaphore::release(int n = 1)
釋放n個資源,默認資源數爲1
該函數還可以自動構建資源片

例如:

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

bool 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 true

bool 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 waiting

Qt 中關於信號量的介紹就這些,本篇翻譯結束。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章