Spec-Zone.ru › Qt 5.6

Класс 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)

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

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

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

Семафоры поддерживают две основные операции, 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 для решения этой задачи.

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

См. также 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

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

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/archives/qt-5.6/qsemaphore.html

Spec-Zone.ru

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