Класс 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
Типичным применением семафоров является управление доступом к кольцевому буферу, совместно используемому потоком-производителем и потоком-потребителем. Пример Semaphores Example демонстрирует, как использовать QSemaphore для решения этой проблемы.
Невычислительным примером семафора было бы посещение ресторана. Семафор инициализируется количеством стульев в ресторане. По мере прибытия людей они хотят занять место. По мере заполнения мест available() уменьшается. По мере ухода людей available() увеличивается, что позволяет большему количеству людей войти. Если группа из 10 человек хочет сесть, но есть только 9 мест, эти 10 человек будут ждать, но группа из 4 человек займет места (количество доступных мест станет 5, что заставит группу из 10 человек ждать дольше).
См. также QSemaphoreReleaser, QMutex, QWaitCondition, QThread и Semaphores Example.
Документация по членам-функциям
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/archives/qt-5.11/qsemaphore.html