Класс 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
Типичное применение семафоров — управление доступом к кольцевому буферу, совместно используемому потоком-производителем и потоком-потребителем. Пример Семафоры показывает, как использовать 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.15/qsemaphore.html