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);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值