Spec-Zone.ru › Qt 5.13

Класс QSemaphore

Класс QSemaphore предоставляет общий семафор со счётчиком. Подробнее...

Заголовок: #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)

Подробное описание

Семафор — это обобщение мьютекса. В то время как мьютекс может быть заблокирован только один раз, семафор может быть получен несколько раз. Семафоры обычно используются для защиты определённого количества идентичных ресурсов.

Семафоры поддерживают две основные операции: 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

Типичное применение семафоров — управление доступом к кольцевому буферу, совместно используемому потоком-производителем и потоком-потребителем. Пример Semaphores Example показывает, как использовать QSemaphore для решения этой задачи.

Пример семафора не в вычислительной сфере — это постановка на обед в ресторане. Семафор инициализируется числом стульев в ресторане. По мере прибытия людей они хотят занять места. По мере заполнения мест available() уменьшается. По мере ухода людей available() увеличивается, что позволяет другим людям войти. Если группа из 10 человек хочет сесть, но есть только 9 мест, эти 10 человек будут ждать, но группа из 4 человек сможет сесть (заняв доступные места и дойдя до 5, в то время как группа из 10 человек будут ждать дольше).

См. также QSemaphoreReleaser, QMutex, QWaitCondition, QThread и Пример семафоров.

Документация по функциям-членам

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

Возвращает количество ресурсов, в настоящее время доступных для семафора. Это число никогда не может быть отрицательным.

См. также acquire() и release().

void QSemaphore::release(int n = 1)

Освобождает n ресурсов, охраняемых семафором.

Эта функция может использоваться для «создания» ресурсов также. Например:

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

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 миллисекунд, пока ресурсы не станут доступными.

Примечание: Передача отрицательного числа в качестве timeout эквивалентна вызову acquire(), т. е. эта функция будет ждать бесконечно, пока ресурсы не станут доступными, если 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

См. также acquire().

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/qsemaphore.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API