Класс 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.14/qsemaphore.html