如何确保在c ++中解锁储物柜?哪种解决方案更好

时间:2014-02-14 05:56:57

标签: c++ locking

有两种解决方案:

A:

lock()
try{
    action()
}catch(...)
{
    unlock()
    throw;
}
unlock()

B:

{
LockObject lockObject;
action();
}

LockObject的构造函数将调用lock(),它的解构函数将调用unlock()。

那么什么是更好的解决方案还是有其他更好的解决方案?

ps:在linux c ++中,它最终不支持关键字。所以我必须为这个问题做出决定。

1 个答案:

答案 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  
}