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
返回信号量当前可用的资源数量。这个数不可能是负的。