C++ 互斥量使用

本文探讨了在开发中如何修复因不当使用互斥量导致的`deviceorresourcebusy`异常。作者通过实例分析了一个MyRecv函数的问题,并提供了修复后的代码,强调了加锁解锁的一致性原则。

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

在这里插入图片描述

💖 前言

在实际开发中,使用互斥量不当,导致程序出现“device or resource busy: device or resource busy”异常错误。

💖 问题

业务代码中,有一个MyRecv函数,Web前端通过RPC调用该函数,获取业务数据,当业务数据过多,程序处理不及时,丢弃缓存,程序就会出现“device or resource busy: device or resource busy”错误,代码,抽象如下:

mutex mu;      //全局变量
void MyRecv(int a)
{
	mu.lock();
	if (a>=10)
	{
		cout << "缓存过多,丢弃不处理!" << endl;
		return;
	}
	cout << a << endl;
	mu.unlock();
}

原因分析,再debug模式下,当a大于10时,函数直接return了,没有对互斥量进行解锁,下次再调用时,就会导致程序崩溃,如下:

在这里插入图片描述

💖 测试

重复加锁,进行模拟测试,代码如下:

void fun03()
{
	mutex mut;
	try{
		mut.lock();
		mut.lock();
		cout << "1111" << endl;
	}
	catch (exception &e)
	{
		cout << e.what() << endl;
	}
	mut.unlock();	
}

结果:
在这里插入图片描述
因此,互斥量使用不当,就会出现“device or resource busy: device or resource busy”提示。

💖 解决方案

在return之前,对互斥量进行正确解锁,如下:

mutex mu;      //全局变量
void MyRecv(int a)
{
	mu.lock();
	if (a>=10)
	{
		cout << "缓存过多,丢弃不处理!" << endl;
		mu.unlock();         //新增
		return;
	}
	cout << a << endl;
	mu.unlock();
}

💖 总结

使用mutex进行加锁、解锁时,必须保证lock、unlock成对出现,且每次加锁之后,正常解锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值