我有一个声明CCriticalSection
对象的类。让我们说,为简单起见,一次只能有一个线程进入并执行该类的方法。
我的问题是,
在声明类级别CSingleLock
并使用它的Lock()和Unlock()方法以及我在每个函数中声明CSingleLock对象时是否存在任何差异。
class ExclusiveClass
{
CCriticalSection mCS;
CSingleLock mSL;
ExclusiveClass() : mCS(), mSL(&mCS) { }
void someMethod
{
mSL.Lock();
// Do whatever you want
mSL.Unlock();
}
}
与
class ExclusiveClass
{
CCriticalSection mCS;
ExclusiveClass() : mCS() {}
void someMethod
{
CSingleLock sl(&mCS);
sl.Lock()
// Do whatever you want
sl.Unlock();
}
}
我知道一个明确的区别。在第二种方法中,我们不需要显式调用Unlock()方法。从函数返回后,将调用sl
的析构函数,方法锁定将自动解锁。
我关注的是例外情况。发生异常时,我确信第二种方法会自动解锁。第一种方法呢?还有其他差异。
答案 0 :(得分:2)
你的第一个例子不是安全例外。如果某件事在Lock
之后但在致电Unlock
之前引发异常,那么你永远不会释放锁定,这很糟糕!
对于这种模式,您应该使用第二个示例中显示的RAII方法。它不仅是例外安全的,而且还可以让您不必担心调用Unlock
,这可能很容易忘记,并且难以追踪错误。