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