有两种解决方案:
A:
lock()
try{
action()
}catch(...)
{
unlock()
throw;
}
unlock()
B:
{
LockObject lockObject;
action();
}
LockObject的构造函数将调用lock(),它的解构函数将调用unlock()。
那么什么是更好的解决方案还是有其他更好的解决方案?
ps:在linux c ++中,它最终不支持关键字。所以我必须为这个问题做出决定。
答案 0 :(得分:2)
B是一种称为资源获取初始化(RAII)的特殊编程习惯,它可以应用于多种编程语言,如C ++,D,Ada。
如果要获取资源,请使用初始化。并且您在析构函数中释放资源。
这是一个众所周知的习语,它也是一个很好的C ++设计。事实上,C ++标准库经常使用它。
例如,
// global mutex
std::mutex mutex;
void f()
{
// lock mutex
std::lock_guard<std::mutex> lock(mutex);
//do something might throw exception
//...
//do not unlock mutex, it will be unlocked by lock_guard destructor
}