Qt线程同步之QSemaphore

1. Qt常用的线程同步类

QMutex,QMutexLocker,QReadWriteLocker,QReadLocker,QWriteLocker,QSemaphore,QWaitCondition

2. QSemphore

2.1 概述

信号量是互斥锁的扩展。互斥锁只能锁定一次,但信号量可以多次获取。
信号量通常用于保护一定数量的相同资源,它允许多个线程在同一时刻访问同一资源。

信号量具有比互斥锁更高的并发性。以生产者消费者问题举例,如果对缓冲区的访问由OMutex保护,则消费者线程不能与生产者线程同时访问缓冲区。然而让两个线程同时在缓冲区的不同部分工作并不会产生问题,使用信号量可以实现让生产者和消费者同时操作缓冲区的不同部分,提高效率。

信号量支持两种基本操作,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

2.2 成员函数说明

  • QSemaphore::QSemaphore(int n = 0)
    创建一个新的信号量并将其保护的资源数量初始化为n(默认为0)
  • QSemaphore::~QSemaphore()
    销毁信号量对象
  • void QSemaphore::acquire(int n = 1)
    尝试获取由信号量保护的n个资源。如果n>available(),则此调用将阻塞,直到有足够的资源可用。
  • int QSemaphore::available() const
    返回信号量当前可用的资源数量。这个数不可能是负的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VectorAL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值