C++ 互斥量使用

  • Post author:
  • Post category:其他


在这里插入图片描述



💖 前言

在实际开发中,使用互斥量不当,导致程序出现“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成对出现,且每次加锁之后,正常解锁。



版权声明:本文为qq_39975542原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。