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;
};
AI 代码解读

目录
打赏
0
1
1
1
2
分享
相关文章
有关D2C工具的思考和分享, 提升前端研发效率
有关D2C工具的思考和分享, 提升前端研发效率
344 1
Java性能优化实践:提升你的应用效率
【2月更文挑战第12天】 在当今快速发展的软件行业中,性能优化是每个Java开发者都必须面对的挑战。本文将深入探讨Java性能优化的关键策略,从代码层面到架构设计,全方位提升应用的运行效率。我们将通过具体案例,展示如何诊断性能瓶颈、优化内存管理、提高并发处理能力,以及采用最新的Java技术栈改善应用性能。加入我们的旅程,一起探索如何让你的Java应用飞速运行。
229 2
提高团队协作效率
提高团队协作效率
106 7
自动化测试框架的构建与优化:提升软件交付效率的关键####
本文深入探讨了自动化测试框架的核心价值,通过对比传统手工测试方法的局限性,揭示了自动化测试在现代软件开发生命周期中的重要性。不同于常规摘要仅概述内容,本部分强调了自动化测试如何显著提高测试覆盖率、缩短测试周期、降低人力成本,并促进持续集成/持续部署(CI/CD)流程的实施,最终实现软件质量和开发效率的双重飞跃。通过具体案例分析,展示了从零开始构建自动化测试框架的策略与最佳实践,包括选择合适的工具、设计高效的测试用例结构、以及如何进行性能调优等关键步骤。此外,还讨论了在实施过程中可能遇到的挑战及应对策略,为读者提供了一套可操作的优化指南。 ####
分享5款极大提升效率的小工具
本文推荐了五款高效实用的软件工具,包括简洁高效的便签工具Knotes、精准的文字识别工具天若OCR、多功能在线平台3171.cn、涵盖视频编辑与文件加密的GiliSoft,以及轻量级内存优化工具Memreduct。这些工具能够显著提升学习和工作的效率,是解决各类问题的得力助手,值得尝试。
84 1
前端效率提升实践之路
在一个B端前端项目中,开发团队面临开发效率低、交付质量和可维护性差的问题。为了解决这些问题,他们以“提效”为主题,展开了项目治理。首先,他们优化了发布和编译过程,通过更换包管理工具、减少不必要的包、使用缓存策略等方法,显著缩短了发布和编译时间。其次,团队致力于沉淀可复用物料,创建了高度配置化的组件,通过VSCode插件助手自动化配置,提高了代码复用性和开发效率。此外,他们还改进了研发流程,制定了前端、后端和产品的规范,以减少沟通成本和提高接口质量。通过这些措施,团队成功提升了开发效率,并降低了代码维护成本。
233 3
前端效率提升实践之路
快速迭代下,研发和测试如何高效配合?
快速迭代下,研发和测试如何高效配合?
163 1
在软件开发中,业务开发和非业务开发哪个工作量更大?
在软件开发中,业务开发和非业务开发哪个工作量更大?
334 0