Процессы и потоки в Qt

QSemaphore в Qt: ограничиваем одновременный доступ к ресурсу

Семафор как счётчик разрешений

QSemaphore хранит число доступных разрешений. Поток, вызвавший acquire(), продолжает работу, если разрешение есть; иначе ждёт, пока другой поток вызовет release(). Это удобно, когда одновременно доступны, например, только три подключения или ограниченное число буферов.

#include <QSemaphore>

QSemaphore permits(3);

void processItem(Item item)
{
    permits.acquire();
    QSemaphoreReleaser releaseOnExit(&permits);
    useLimitedResource(item);
}

QSemaphoreReleaser освобождает разрешение при выходе из области видимости, в том числе при раннем возврате. Проверьте доступность этого класса в версии Qt проекта; иначе используйте собственный scope guard. Не удерживайте разрешение во время работы, которая не использует ограниченный ресурс: это уменьшит пропускную способность.

Мьютекс обеспечивает взаимоисключающий доступ к критической секции. Семафор с начальным значением больше единицы разрешает нескольким потокам использовать ограниченный ресурс одновременно. При использовании tryAcquire() проверяйте результат и продумайте поведение при отказе или тайм-ауте. Неверный баланс acquire() и release() может заблокировать ожидающие потоки.