对象级别 CSingleLock 与方法级别 CSingleLock

Object level CSingleLock vs method level CSingleLock

本文关键字:CSingleLock 方法 对象      更新时间:2023-10-16

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

我在这里担心的是例外。当发生异常时,我确信第二种方法将自动解锁。第一种方法呢?还有其他区别吗?

您的第一个示例不是异常安全的。如果某些东西在Lock之后但在调用Unlock之前抛出异常,您将永远不会释放锁,这很糟糕!

对于这种模式,您应该使用您在第二个示例中展示的 RAII 方法。它不仅异常安全,而且使您不必担心调用Unlock,您很容易忘记这样做并获得一些难以追踪的错误。