Семафор как счётчик разрешений
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() может заблокировать ожидающие потоки.