QSemaphore
一、描述
信号量通常用于保护一定数量的相同资源。信号量支持两种基本操作:获取资源和释放资源。
二、成员函数
1、~QSemaphore()
警告:销毁正在使用的信号量可能会导致未定义的行为。
2、void acquire(int n = 1)
尝试获取由信号量保护的 n 个资源。 如果 n > available(),此调用将阻塞,直到有足够的资源可用。
3、void release(int n = 1)
释放由信号量保护的 n 个资源。
4、bool tryAcquire(int n = 1)
尝试获取由信号量保护的 n 个资源并在成功时返回 true。如果 available() < n,此调用将立即返回 false 而不获取任何资源。
5、bool tryAcquire(int n, int timeout)
尝试获取由信号量保护的 n 个资源并在成功时返回 true。 如果 available() < n,则此调用将最多等待超时毫秒,之后再看是否有足够多的资源。
注意:传递负数作为超时等效于调用acquire()。
QSemaphoreReleaser
一、描述
QSemaphoreReleaser 可以用使用 QSemaphore::release() 的地方。构造一个 QSemaphoreReleaser 会推迟对信号量的 release() 调用,直到 QSemaphoreReleaser 被销毁。
可以使用它来可靠地释放信号量,以避免在遇到异常或提前返回时出现死锁。
QSemaphore sem;
sem.release();
如果在到达 sem.release() 调用之前提前返回或抛出异常,则不会释放信号量,这可能会阻止在相应的 sem.acquire() 调用中等待的线程继续执行。
改用 RAII 时:
const QSemaphoreReleaser releaser(sem);
编译器将确保 QSemaphoreReleaser 析构函数始终被调用,因此信号量始终被释放。
QSemaphoreReleaser 是支持移动语义的,因此可以从函数返回,以转移信号量将它释放到函数或作用域之外:
{
QSemaphoreReleaser releaser;
if (someCondition)
{
releaser = QSemaphoreReleaser(sem);
}
}
二、成员函数
1、QSemaphoreReleaser(QSemaphoreReleaser &&other)
移动构造函数。 接管从其他人那里调用 QSemaphore::release() 的责任。
2、QSemaphore * cancel()
析构函数将不再调用 semaphore()->release()。 在此调用之前 semaphore() 返回信号量的值。 在此调用之后,semaphore() 将返回 nullptr。
要再次启用,请分配一个新的 QSemaphoreReleaser:
releaser.cancel();
releaser = QSemaphoreReleaser(sem, 42);
3、QSemaphore * semaphore()
返回指向提供给构造函数的 QSemaphore 对象的指针。