C++ 互斥量使用

C++ 互斥量使用_第1张图片

目录

  • 前言
  • 问题
  • 测试
  • 解决方案
  • 总结

前言

在实际开发中,使用互斥量不当,导致程序出现“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了,没有对互斥量进行解锁,下次再调用时,就会导致程序崩溃,如下:

C++ 互斥量使用_第2张图片

测试

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

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

结果:
C++ 互斥量使用_第3张图片
因此,互斥量使用不当,就会出现“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成对出现,且每次加锁之后,正常解锁。

你可能感兴趣的:(C++,c++,开发语言)