1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/cryfeifei-QtDocumentCN

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
QSemaphore.md 6.1 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Ryan-rlm Отправлено 23.08.2020 08:15 e3b5c1c

QSemaphore

  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():

  • acquire(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

  信号量的一个典型应用场景,是控制生产者线程和消费者线程对共享循环缓冲区的访问。生产者消费者示例展示了如何使用 QSemaphore 来解决这个问题。

  一个非计算信号量(non-computing)的例子是在餐馆就餐。用餐厅里的椅子数初始化信号量。当人们到达时,他们需要要一个座位。入座后,available() 将减少。当人们离开时,available() 会增加,允许更多的人进入。如果有一个 10 人的聚会,但是餐馆只有 9 个座位,那这 10 个人会等待空出位置。但是如果此时有一个 4 人的聚会,那么他们会入座(将可用的座位减少到 5 个,10 人聚会将等待更长时间)。

另请参阅: QSemaphoreReleaserQMutexQWaitConditionQThread生产者消费者示例

成员类型文档

QSemaphore::QSemaphore(int n = 0)

  构造一个信号量并将其保护的资源数量初始化为 n(默认为0)。

另请参阅: release(),available()。


QSemaphore::~QSemaphore()

  析构。

警告:析构正在使用的信号量可能会导致未定义的行为。


void QSemaphore::acquire(int n = 1)

  尝试获取由信号量保护的 n 个资源。如果 n > available(),则此调用将阻塞,直到有足够的资源可用。

另请参阅: release(),available(),tryAcquire()。


int QSemaphore::available() const

  返回信号量当前可用的资源数。返回值永远不会是负数。

另请参阅: release(),available()。


void QSemaphore::release(int n = 1)

  释放 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


bool QSemaphore::tryAcquire(int n = 1)

  尝试获取由信号量保护的 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()。


bool QSemaphore::tryAcquire(int n, int timeout)

  尝试获取由信号量保护的 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/cryfeifei-QtDocumentCN.git
git@api.gitlife.ru:oschina-mirror/cryfeifei-QtDocumentCN.git
oschina-mirror
cryfeifei-QtDocumentCN
cryfeifei-QtDocumentCN
master