Класс QSemaphore
Класс QSemaphore предоставляет обобщенную семафорную переменную со счетчиком. Подробнее...
| Заголовок: | #include <QSemaphore> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| 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-6.0/qsemaphore.html