Csinglelock有什么用?

what is the use of Csinglelock?

MSDN中提到,要锁定和解锁CCriticalSection对象,我们应该使用CSingleLock。但是 CCriticalSection::lock() 和 CCriticalSection::unlock() 做同样的事情,不是吗?那么这两种方法有什么区别呢?

使用包装器将确保(几乎)无论您从锁定锁的位置开始做什么,当您离开该功能时,它都会解锁。

考虑:

void func()
{
    lock();
    ... plenty of lines ... 
    // x = 8128 happens on a Wednesday, in a month without 
    // r in the name, only if the day is divisible by 7 and 3. 
    if (x == 8128)
       return;
    ... more lines of code ... 
    unlock();
}

因此,您的应用程序有时会忘记解锁锁。

如果遇到异常、使用 goto 等,同样适用。

如果使用包装器,则可以保证在包装器作用域结束时调用析构函数。这对 std::stringstd::vector 和锁一样有用。

当然,如果你用例如longjmp跳出上下文也无济于事。但是你不应该使用 longjmp!