大家可以在使用到了互斥量的类中包含这个AutoLock类
原理十分简单, AutoLock类对象在构造时对构造时传入的互斥量加锁, 析构时对该互斥量解锁, 这样Test类中的Fun函数就整个加锁了, 而我们无须担心忘记解锁, 另外如果不想给整个Fun加锁, 可以在需要开始加锁的地方构造AutoLock对象, 若还需要在Fun函数结束前解锁还可以通过new delete AutoLock对象来实现, 不过那样就不如直接使用EnterCriticalSection以及LeaveCriticalSection了, 失去了AutoLock的意义。
class AutoLock
{
public:
AutoLock(CRITICAL_SECTION& cs) : cs_(cs)
{
EnterCriticalSection(&cs_);
}
~AutoLock()
{
LeaveCriticalSection(&cs_);
}
private:
CRITICAL_SECTION& cs_;
};
class Test
{
public:
Test()
{
InitializeCriticalSection(&m_cs);
}
void Fun()
{
/*
EnterCriticalSection(&m_cs);
//do your things...
LeaveCriticalSection(&m_cs);
*/
AutoLock lock(m_cs);
//do your things...
}
private:
CRITICAL_SECTION m_cs;
};