Qt线程:QSemaphore 和 QSemaphoreReleaser

本文介绍了QSemaphore在多线程编程中的应用,包括资源的获取与释放,以及如何使用QSemaphoreReleaser确保资源在异常情况下也能正确释放,防止死锁。通过示例展示了如何利用RAII原则来增强代码的健壮性,并讨论了信号量在并发控制中的重要性。
摘要由CSDN通过智能技术生成

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 对象的指针。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值