在MSDN中提到,要锁定和解锁CCriticalSection对象,我们应该使用CSingleLock。但CCriticalSection :: lock()和CCriticalSection :: unlock()做同样的事情,不是吗?那两种方法有什么区别?
答案 0 :(得分:1)
使用包装器将确保(几乎)无论您从锁定锁定的位置做什么,当您离开该功能时,它将解锁。
考虑:
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::string
或std::vector
和锁定一样有用。
当然,如果您使用例如longjmp
跳出上下文,它将无济于事。但是你不应该使用longjmp
!