Qt提供的线程同步方式
一般采用了4种方式,主要是为了线程之间的步调,以便更好的配合
- QMutex QMutexLocker
- QSemphore
- QWaitCondition
- QReadWriteLock
QMutex
最常用的方式,值得注意的是,需要在两个线程中使用同一个锁,然后才能起到锁的作用,主要是为了防止多线程对单个数据的同事操作。所以,在单线程中,对于锁而言,是没有任何意义的。而对于QMutexLocker而言,对于当前的范围,进行锁住,当离开范围时,自动解锁。
run() {
m_mutex.lock()
// TODO .....
m_mutex.unlock();
exec(); // 当有事件循环时,QTimer,QTcpSocket等
}
// 或者采用下面的形式,不用担心分支什么的。
while (1) {
{ // 括弧给与locker的范围
QMutexLocker locker(&m_mutex)
if (m_bStop)
break;
}
}
QSemphore
这是一种提供计数的信号量,所以在消费者与生产者模型中,就变得十分的好用。如果缓存被消费者还没有读取的数据填满,acquire()的调用就会阻塞,直到消费者已经开始消耗这些数据为。下面是Qt文档举得例子
// 表明资源的个数
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.re

本文介绍了Qt中四种线程同步方法:QMutex及其 locker、QSemaphore、QWaitCondition和QReadWriteLock。QMutex用于防止多线程同时访问同一数据,QSemaphore作为计数信号量适用于消费者与生产者模型,QWaitCondition需要配合锁使用以防优先级反转问题,QReadWriteLock则允许多个读者并发访问而限制写者访问。

152





