QSemaphore类提供了一个通用的信号量。更多内容...
属性 | 内容 |
---|---|
头文件 | #include <QSemaphore> |
qmake |
QT += core |
注意: 此类中所有函数都是线程安全的。
返回类型 | 函数 |
---|---|
QSemaphore(int n = 0) | |
~QSemaphore() | |
void | acquire(int n = 1) const |
int | available() const |
void | release(int n = 1) |
bool | tryAcquire(int n = 1) |
bool | tryAcquire(int n, int timeout ) |
信号量是互斥量的泛化。虽然互斥量只能锁定一次,但可以多次获取信号。信号量通常用于保护一定数量的相同资源。
信号量支持两个基本操作,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
来解决这个问题。
一个非计算信号量(non-computing
)的例子是在餐馆就餐。用餐厅里的椅子数初始化信号量。当人们到达时,他们需要要一个座位。入座后,available() 将减少。当人们离开时,available() 会增加,允许更多的人进入。如果有一个 10 人的聚会,但是餐馆只有 9 个座位,那这 10 个人会等待空出位置。但是如果此时有一个 4 人的聚会,那么他们会入座(将可用的座位减少到 5 个,10 人聚会将等待更长时间)。
另请参阅: QSemaphoreReleaser,QMutex,QWaitCondition,QThread 和 生产者消费者示例。
构造一个信号量并将其保护的资源数量初始化为 n
(默认为0)。
析构。
警告:析构正在使用的信号量可能会导致未定义的行为。
尝试获取由信号量保护的 n 个资源。如果 n > available()
,则此调用将阻塞,直到有足够的资源可用。
另请参阅: release(),available(),tryAcquire()。
返回信号量当前可用的资源数。返回值永远不会是负数。
释放 n 个信号量保护的资源。
这个函数也可以用来“创建”资源。例如:
QSemaphore sem(5); // 信号量保护 5 个资源 sem.avilable() == 5
sem.acquire(5); // 请求 5 个资源 sem.avilable() == 0
sem.release(5); // 释放 5 个资源 sem.avilable() == 5
sem.release(10); // “创建” 10 个新资源 sem.avilable() == 15
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
,此调用将等待 timeout
毫秒,以尝试获取。
注意:传递一个负数作为超时相当于调用 acquire()
,也就是说,如果 timeout
为负数,这个函数将永远等待资源可用。
例如:
QSemaphore sem(5); // sem.available() == 5
sem.tryAcquire(250, 1000); // sem.available() == 5, 等待 1000 毫秒,returns false
sem.tryAcquire(3, 30000); // sem.available() == 2, 立即返回,returns true
另请参阅: acquire()。
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )