AutoLock 解决加锁后忘记解锁问题

    技术2022-05-19  19

      大家可以在使用到了互斥量的类中包含这个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; }; 

     


    最新回复(0)