关于 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 中关于信号量的介绍就这些,本篇翻译结束。