zoukankan      html  css  js  c++  java
  • 封装个简单的自动锁

    #pragma once

    //锁接口
    class ILock 

    public
        virtual ~ILock() {} 
        virtual void Lock() = 0
        virtual void Unlock() = 0
    }; 

    /************************************************************************/
    /*        CRITICAL_SECTION                                              */
    /************************************************************************/
    class CriticalSectionLocker 
        : ILock
    {  
    public
        inline CriticalSectionLocker(void)
        {
            InitializeCriticalSection(&m_hCriticalSection); 
        }

        inline virtual ~CriticalSectionLocker(void)
        {
            DeleteCriticalSection(&m_hCriticalSection); 
        }

        inline virtual void Lock()
        {
            EnterCriticalSection(&m_hCriticalSection);
        }

        inline virtual void Unlock()
        {
            LeaveCriticalSection(&m_hCriticalSection); 
        }
    private:
        CRITICAL_SECTION m_hCriticalSection;
    }; 

    /************************************************************************/
    /* Mutex                                                                */
    /************************************************************************/

    //互斥对象锁类 

    class MutexLocker
        : public ILock 

    public
        MutexLocker()
        {
            m_mutex = ::CreateMutex(NULL, FALSE, NULL); 
        }

        ~MutexLocker()
        {
            ::CloseHandle(m_mutex);
        }

        inline virtual void Lock()
        {
            DWORD d = WaitForSingleObject(m_mutex, INFINITE);
        }

        inline virtual void Unlock()
        {
            ::ReleaseMutex(m_mutex);
        }

    private
        HANDLE m_mutex; 
    }; 

    /************************************************************************/
    /* 自动锁                                                                     */
    /************************************************************************/
    template <typename LockTyp>
    class AutoLock 

        LockTyp* m_pLock; 
    public
        AutoLock(LockTyp& locker) 
        { 
            m_pLock = &locker; 
            m_pLock->Lock(); 
        } 

        AutoLock(LockTyp* locker) 
        { 
            m_pLock = locker; 
            m_pLock->Lock(); 
        } 

        ~AutoLock(void
        { 
            m_pLock->Unlock(); 
        } 
    }; 
  • 相关阅读:
    我把 Spring Boot Banner 换成了美女背景后……
    玩大发了,Tomcat 8.5 升级有坑…
    10 分钟快速上手 Shiro 新手教程
    为什么 HashMap 的加载因子是0.75?
    图解 Spring 循环依赖,写得太好了!
    单点登录的实现原理是什么?怎么实现?
    Maven三种仓库详解
    为什么 wait,notify,notifyAll 在 Object 类定义而不是 Thread 类?
    我们公司用了6 年的分布式锁,很是厉害!
    Google 开源的依赖注入库,比 Spring 更小更快!
  • 原文地址:https://www.cnblogs.com/kenter/p/2295742.html
Copyright © 2011-2022 走看看