Qt中的线程同步问题

	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);
	}
}

你可能感兴趣的:(Qt,qt,开发语言)