Qt提供了多个类实现线程同步,包括QMutex,QMutexLocker,QReadWriteLocker,QReadLocker,QWriteLocker,
QWaitCondition和QSemaphore。
QMutex和QMutexLocker是基于互斥量的线程同步类,QMutex定义的实例是一个互斥量,QMutex主要提供三个函数:
1.lock():锁定互斥量,若另一个线程锁定了这个互斥量,它将阻塞执行直到其他线程解锁这个互斥量
2.unlock(): 解锁一个互斥量,与lock()配对使用
3.tryLock(): 试图锁定一个互斥量,成功则返回true,若其他线程锁定该互斥量,返回false,不阻塞程序运行。
可通过QMutex类定义互斥变量,实现投掷骰子程序的互斥访问。
void DiceThread::run() {
m_goOn = true;
m_seq = 0;
qsrand(QTime::currentTime().msec());
while (m_goOn) {
if (!m_pause) {
mutex.lock();
m_diceValue = qrand();
m_diceValue = (m_diceValue % 6) + 1;
m_seq++;
mutex.unlock();
}
msleep(500);
}
}
bool DiceThread::readDiceValue(int& seq, int& dicevalue) {
if (mutex.tryLock()) {
seq = m_seq;
dicevalue = m_diceValue;
mutex.unlock();
return true;
}
else {
return false;
}
}
QMutex需要配对使用lock()与unlock()来实现代码段的保护,在一些逻辑复杂的代码段或可能出现异常的代码中,配对
可能会出错。
QMutexLocker是简化了互斥量处理的类,它的构造函数接受一个互斥量作为参数并将其锁定,它的析构函数将此互斥
量解锁,因此在其生命周期内代码段得到保护,自动进行互斥量的锁定和解锁。
可将函数更改为:
void DiceThread::run() {
m_goOn = true;
m_seq = 0;
qsrand(QTime::currentTime().msec());
while (m_goOn) {
if (!m_pause) {
QMutexLocker locker(&mutex);
m_diceValue = qrand();
m_diceValue = (m_diceValue % 6) + 1;
m_seq++;
}
msleep(500);
}
}