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