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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值