QMutext 项目使用中的效率问题

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

目录
相关文章
|
6月前
|
人工智能 JSON 前端开发
有关D2C工具的思考和分享, 提升前端研发效率
有关D2C工具的思考和分享, 提升前端研发效率
286 1
|
1月前
|
文字识别 监控 小程序
分享5款极大提升效率的小工具
本文推荐了五款高效实用的软件工具,包括简洁高效的便签工具Knotes、精准的文字识别工具天若OCR、多功能在线平台3171.cn、涵盖视频编辑与文件加密的GiliSoft,以及轻量级内存优化工具Memreduct。这些工具能够显著提升学习和工作的效率,是解决各类问题的得力助手,值得尝试。
41 1
|
2月前
|
监控 数据挖掘
提高团队协作效率
提高团队协作效率
35 3
|
6月前
|
搜索推荐
分享5款对工作学习有帮助的效率软件
今天再来推荐5个超级好用的效率软件,无论是对你的学习还是办公都能有所帮助,每个都堪称神器中的神器,用完后觉得不好用你找我。
52 6
|
6月前
|
监控 测试技术
提升测试效率
提升测试效率
jira学习案例8-用useFebouce减少工程请求效率1
jira学习案例8-用useFebouce减少工程请求效率1
89 0
jira学习案例8-用useFebouce减少工程请求效率1
|
机器学习/深度学习 存储 数据可视化
开发者效率的几个瓶颈点
开发者效率的几个瓶颈点
开发者效率的几个瓶颈点
|
测试技术
软件测试面试题:如何降低自动化维护成本
软件测试面试题:如何降低自动化维护成本
176 0
|
前端开发 JavaScript IDE
聊聊开发日常的效率提升工具(全)
前言:日常开发中,好的工具往往能让我们事半功倍,有句老话说得好:工欲善其事,必先利其器。使用高效率的工具可以极大提升我们的开发效率。接下来分享下树酱平时开发中经常使用的一些效率工具
234 0
聊聊开发日常的效率提升工具(全)
解决了这7个问题,我的产出效率提升了100%
精力管理,是个人在职场上实现跃迁的一个重要因素。 虽然每个人的一天都是24小时,但是会精力管理的人,他们的产出可能是不会精力管理人的好几倍。他们能够更快实现职场晋升、能力发展,他们的人生更有密度和价值。 在过去的1年里,我积累了很多精力管理的经验,下面一一分享给大家 ## 一、掌握这四招,学会合理制定计划 ### 1、为什么要做计划? 计划的两个核心作用就是规划与