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.a