对象级CSingleLock与方法级CSingleLock

时间:2014-03-26 17:08:56

标签: c++ multithreading asynchronous mfc locking

我有一个声明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的析构函数,方法锁定将自动解锁。

我关注的是例外情况。发生异常时,我确信第二种方法会自动解锁。第一种方法呢?还有其他差异。

1 个答案:

答案 0 :(得分:2)

你的第一个例子不是安全例外。如果某件事在Lock之后但在致电Unlock之前引发异常,那么你永远不会释放锁定,这很糟糕!

对于这种模式,您应该使用第二个示例中显示的RAII方法。它不仅是例外安全的,而且还可以让您不必担心调用Unlock,这可能很容易忘记,并且难以追踪错误。