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::string
或 std::vector
和锁一样有用。
当然,如果你用例如longjmp
跳出上下文也无济于事。但是你不应该使用 longjmp
!
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::string
或 std::vector
和锁一样有用。
当然,如果你用例如longjmp
跳出上下文也无济于事。但是你不应该使用 longjmp
!