QMutext 项目使用中的效率问题

本文分享了一次Qt开发项目中遇到的QMutex使用导致效率问题的经验,详细介绍了如何通过调整QMutex使用方式来提高程序运行效率,包括使用QMutex::Recursive支持嵌套锁定、QMutex::trylock设定等待时间及QMutexLocker简化锁定和解锁操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做一个项目,采用Qt开发,在串口通讯采集与转发上要求高效率执行,发现效率不理想,
抛去串口返回响应时间的约束,程序逻辑实现上也花费了较长时间,最后定位在 QMutext为罪魁祸首。

项目一开始为了赶工,是这样使用QMutex的:

struc ValA
{
	//
};
struc ValB
{
	//
};
struc ValC
{
	//
};

class A
{
public:
	A(){};
	void funcCall(){
		m_Mutex_A.lock();
		//iVal_A 相关逻辑处理
		m_Mutex_A.unlock();
	}
	void funcA()
	{
		m_Mutex_A.lock();
		if(condition(iVal_A 相关)){
			m_Mutex_A.unlock();
			//iVal_A 无关逻辑处理
			funcCall();
		}else{
			m_Mutex_A.unlock();
		}
	}
	void funcB()
	{
		//高优先级,必须每次获取到资源执行
		m_Mutex_B.lock();
		//iVal_B 相关逻辑处理
		m_Mutex_B.unlock();
		funcCall();
	}
	void funcC()
	{
		//低优先级,不执行也可以
		m_Mutex_B.lock();
		//iVal_B 相关逻辑处理
		m_Mutex_B.unlock();
	}
	void funcD()
	{
		m_Mutex_C.lock();
		//iVal_C 相关逻辑处理
		if(condition1(iVal_C 相关))
			m_Mutex_C.unlock();
			return;
		if(condition2(iVal_C 相关))
			//iVal_C 相关逻辑处理
			m_Mutex_C.unlock();
			return;
		......
		//iVal_C 相关逻辑处理
		m_Mutex_C.unlock();
	}
private:
	ValA iVal_A;
	QMutex m_MutexA;
	ValB iVal_B;
	QMutex m_MutexB;
	ValB iVal_C;
	QMutex m_MutexC;
};

class ThreadA : public Thread
{
protected:
    virtual void run()
	{
		while(condition){
			funcA();
			funcB();
			funcD();
		}
		exec();
	}
};
class ThreadB : public Thread
{
protected:
    virtual void run()
	{
		while(condition){
			funcA();
			funcC();
			funcD();
		}
		exec();
	}
};


根据QMutex\QMutexLocker特性
1)QMutex::Recursive支持嵌套锁定
2)QMutex::trylock支持设定等待时间
3)QMutexLocker可简化互斥量的锁定和解锁操作
进行改造:
class A
{
public:
	A():m_MutexA(QMutex::Recursive)//支持嵌套锁
	{};
	void funcCall(){
		//iVal_A 相关逻辑处理
	}
	void funcA()
	{
		QMutexLocker locker(&m_MutexA);
		if(condition(iVal_A 相关)){
			//iVal_A 无关逻辑处理
			funcCall();
		}
	}
	void funcB()
	{
		//高优先级,必须每次获取到资源执行
		m_Mutex_B.lock();
		//iVal_B 相关逻辑处理
		m_Mutex_B.unlock();
		QMutexLocker locker(&m_MutexA);
		funcCall();
	}
	void funcC()
	{
		//低优先级,不执行也可以
		if(m_Mutex_B.trylock(100))//100毫秒外自动返回
		{
			//iVal_B 相关逻辑处理
			m_Mutex_B.unlock();
		}
	}
	void funcD()
	{
		QMutexLocker locker(&m_Mutex_C);//对于不断有返回的函数很有用
		//iVal_C 相关逻辑处理
		if(condition1(iVal_C 相关))
			return;
		if(condition2(iVal_C 相关))
			//iVal_C 相关逻辑处理
			return;
		......
		//iVal_C 相关逻辑处理
	}
private:
	ValA iVal_A;
	QMutex m_MutexA;
	ValB iVal_B;
	QMutex m_MutexB;
	ValB iVal_C;
	QMutex m_MutexC;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

py_free-物联智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值